2

我有一个模型类,其中包括:

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. 我的模型协会有类似的东西吗?

4

2 回答 2

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
于 2009-07-22T22:58:42.983 回答
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
于 2009-07-22T22:56:55.607 回答