まさしく has_many :through なサイトを見て、 昨日の続き。:uniq とは関係ないけど。
class Group < ActiveRecord::Base
has_many :assigns
has_many :members, :through => :assigns
has_many :leaders, :through => :assigns, :source => :leader,
:conditions => ["leader = ?", true]
end
class Assign < ActiveRecord::Base
belongs_to :group
belongs_to :member
belongs_to :leader, :class_name => "Member"
end
リンク先のは、:conditions の指定場所が間違ってるような気がする。
Group.find(:all).map(&:leaders).flatten.map(&:name)
ここでは :include しても proxy な方を叩くので、結局個別に :conditions を見るのか。 というか、ふつうに Assign 側から調べればいいことに今さら気づく。
Assign.find(:all, :include => :member, :conditions => ["leader = ?", true]).map{|a| a.member.name}
うーん、Symbol#to_proc ではメソッドチェーンは呼べないんですよね。 なんだよこの a って*1。というわけで、
class String
def to_proc
Proc.new{|obj| split(".").inject(obj){|res, meth| res.__send__(meth)}}
end
end
Assign.find(:all, :include => :member, :conditions => ["leader = ?", true]).map(&"member.name")
OK。
遊んでないで、DWN やりまーす。
*1 とか思うようになってしまってる今日この頃