0

早上,我有 3 个模型 - 用户、事件和签到

用户可以是与会者或共同发言人。关系/集合连接有效。但是,每当我创建一个事件时;它会自动将它们添加到共同扬声器阵列。在我的创建方法中,它应该只将它们添加到参加者数组中。

调用@event.attendees给了我正确的current_user,但是它不应该为@event.cospeaker返回相同的值。

用户.rb

has_many :checkins
has_many :events, :through => :checkins

签入.rb

belongs_to :user
belongs_to :event

事件.rb

has_many :checkins
has_many :attendees, :through => :checkins, :source => :user
has_many :cospeakers, :through => :checkins, :source => :user
belongs_to :owner, :class_name => "User"

事件控制器

def create
@event = current_user.events.build(params[:event])
 if @event.save
     @event.owner = current_user

     @event.attendees << current_user
     @event.save
    redirect_to checkin_event_path(:id => @event.id)
 end
end
4

1 回答 1

0

你的问题在这里:

has_many :attendees, :through => :checkins, :source => :user
has_many :cospeakers, :through => :checkins, :source => :user

has_many through: 与 has_and_belongs_to_may 相同,只是链接表有一个自定义名称。您实质上是在说“活动参与者是签到表中的任何用户”和“活动共同发言人是签到表中的任何用户”。您可以看到为什么会返回相同的结果。

您需要做的是向 checkins 表添加一个标志,然后通过:向 has_many 添加一个条件:。假设您在 checkins 表中添加了一个“is_cospeaker”布尔值,您可以这样做:

has_many :attendees, through: :checkins, source: :user, conditions: {is_cospeaker: false}
has_many :cospeakers, through: :checkins, source: :user, conditions: {is_cospeaker: true}

(注意,这是 Ruby 1.9+ 的哈希语法。希望您使用的是 Ruby 1.9 或 2.0)

于 2013-09-14T15:15:34.440 回答