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共通条件で呼び出すメソッドを作成できます。ブロックで乾かす方法の 1 つを次に示します。

{ :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 に答える