1

在我的 Rails 应用程序中,我有 Event 和 User 模型。业务规则规定一个事件有一个所有者和许多成员,并且所有者必须是成员。反之亦然,用户拥有许多“拥有的事件”和“事件”(他/她是其成员但不是所有者的事件)。我最初计划像这样对这种关联进行建模:

class Event < ActiveRecord::Base
  has_many :event_members, dependent: :destroy

  has_one :owner, through: :event_members, source: :user, conditions: { owner: true }
  has_many :members, through: :event_members, source: :user
end

class EventMember < ActiveRecord::Base
  belongs_to :event
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :owned_events, through: :event_members, conditions: { owner: true }
  has_many :events, through: :event_members
end

我认为这将确保一个所有者和该所有者将免费包含在成员协会中。但是,这不起作用,因为我无法通过集合指定 has_one - :event_members 关联。

有没有更好的方法来建模这个?我可以在 Event 上添加一个临时的“所有者”属性,通过所有者标志查询 EventMember - 但这是否适用于设置所有者(即我可以获取创建的 EventMember 记录并确保设置了所有者标志)?

4

1 回答 1

4

owner在连接模型上添加一个属性怎么样EventMember(也是event_members表中布尔类型的字段,默认值为false)。访问每个模型上的ownerand with 方法。owned_events

class Event < ActiveRecord::Base             
  has_many :event_members
  has_many :members, :through => :event_members, :source => :user

  def owner                                  
    event_members.ownerships.map(&:user).first                                                              
  end                                        
end                                          

class EventMember < ActiveRecord::Base       
  belongs_to :event                          
  belogns_to :user

  scope :ownerships, -> { where(:owner => true) }                          
end                                          

class User < ActiveRecord::Base              
  has_many :event_members                    
  has_many :events, :through => :event_members

  def owned_events                           
    event_members.ownerships.map(&:event)      
  end                                        
end

Event对象可能有责任使用户成为其所有者。

class Event
  def make_owner!(user)
    membership = event_members.where(:user_id = user).first
    membership.owner = true
    membership.save
  end
end

也许在其中放置逻辑以仅强制执行一个所有者和抽象部分,make_owner!EventMember取决于这在您的应用程序中的混乱程度。

于 2013-05-19T23:00:34.713 回答