2009-07-22 58 views
2

我有了一个模型类,其中包括:晒我的has_many在Rails的

class Group < ActiveRecord::Base 
    has_many :subscriptions 
    has_many :users, :through => :subscriptions 

    has_many :admins, :through => :subscriptions, :source => :user, :conditions => "subscriptions.role = #{ROLES[:admin]}" 
    has_many :subscribers, :through => :subscriptions, :source => :user, :conditions => "subscriptions.role >= #{ROLES[:subscriber]}" 
    has_many :authors, :through => :subscriptions, :source => :user, :conditions => "subscriptions.role >= #{ROLES[:author]}" 
    has_many :pending_subscribers, :through => :subscriptions, :source => :user, :conditions => "subscriptions.pending = true" 
end 

次重复:through => :subscriptions, :source => :user数量困扰我。我知道路线文件,你可以做map.with_options。对于我的模型关联有没有类似的东西?

回答

10

with_options实际上是对Object的扩展,所以你可以在你的ActiveRecord::Base使用它,以及

with_options :through => :subscriptions, :source => :user do |obj| 
    obj.has_many :admins, :conditions => "subscriptions.role = #{ROLES[:admin]}" 
    obj.has_many :subscribers, :conditions => "subscriptions.role >= #{ROLES[:subscriber]}" 
    obj.has_many :authors, :conditions => "subscriptions.role >= #{ROLES[:author]}" 
    obj.has_many :pending_subscribers, :conditions => "subscriptions.pending = true" 
end 
+0

这个工作很好,谢谢! – 2009-07-23 13:50:00

2

您可以创建一个调用has_many并具有常用条件的方法。下面是了一个块干燥的一种方法:

{ :admins => "subscriptions.role = #{ROLES[:admin]}", 
    :subscribers => "subscriptions.role = #{ROLES[:subscriber]}", 
    :authors => "subscriptions.role >= #{ROLES[:author]}", 
    :pending_subscriptions => "subscriptions.pending = true" }.each do |property, condition| 
    has_many key, :through => :subscriptions, :source => :user, :conditions => condition 
end