トップ «前の日記(2007-01-07) 最新 次の日記(2007-01-20)» 編集

3 日坊主日記


2007-01-18 [長年日記]

_ [Rails] where plugin の Cond を Rio 的な遅延評価で書けたら

ActiveRecord で

 S.find(:all, :conditions => ["city = ?", "Paris"])

 S.find(:all).select { |s| s.city == "Paris" }

と書くと、速度・メモリに深刻なダメージを受けるけど、 where plugin の Cond を Rio 的な遅延評価で書けたら

 S.select { |s| s.city == "Paris" }.find(:all)

と書けて嬉しいかも。

select の alias として conditions, where, restrict 辺りを用意。

 && -> Rel.and (Rel#& ??)
 || -> Rel.or  (Rel#| ??)
 !  -> Rel.not
 :select option -> Rel.project("city")
 :joins, :include option -> Rel.join("S", "P")

また、ActiveRecord と SQL (RDBMS) の間に何かがあるとすれば、こういうことは当然できるに違いない。

_ [Rails] 関係演算ぽく表現

妄想ネタの続き。

関係演算ぽく表現してみる。 比較演算は実装が難しそうなので theta にしておく。

_ scoped_access

 class UserMemoController < MemoController
   scoped_access Memo, :restricted
 protected
   def restricted
     ScopedAccess::MethodScoping.new(:user_id => session[:user].id)
   end
 end
 memo_rel = Memo
 user_memo_rel = Memo.select { |m| Rel.theta("=", m.user_id, session[:user].id) }
 ...
 user_memo_rel.find(:all)

_ acts_as_view

 class Member < ActiveRecord::Base; end
 class ActiveMember < Member
   acts_as_view :deleted => false
 end
 class InheritedActiveGrade2Member < ActiveMember
   acts_as_view :grade=>2
 end
 member_rel = Member
 active_member_rel = member_rel.select { |m| Rel.theta("=", m.deleted, false) }
 active_grade2_member_rel = active_member_rel.select { |m| Rel.theta("=", m.grade, 2) }

_ has_many

 class S
   has_many :ps  # P
 P.semijoin(S)
 P.matching(S)

_ extend

拡張はそのまま module の extend で表現できそうだ。

 module M
   def gmwt
     weight * 454
 P.extend(M)

_ [Rails] Tagged Rails 1.2.0

キター

[]