2012-06-27 31 views
3

我有一个关于Ruby中某个数据模型的问题。我有一组业务需求:红宝石数据模式has_many关系双向

用户可以创建多个工作坊

用户可以参加许多研讨会

车间有一个所有者(用户)

车间拥有众多的与会者(用户)

这种关系的第一部分是容易设置:

#user.rb 
class User < ActiveRecord::Base 
    has_many :workshops 
end 

#workshop.rb 
class Workshop < ActiveRecord::Base 
    belongs_to :user 
end 

但是,我将如何使从研讨会到用户的“其他has_many”关系。我可以做一些工作坊,比如belongs_to:user,:as:owner。和一个研讨会has_many:users,:as:参加者?

你对此有何看法?更糟糕的是一个生产车间具有与会者限制,所以我需要验证...

感谢, 丹尼尔

回答

3

你有一个的has_many到HAS_MANY关系,所以你需要创建一个新的关联表关联关系(可以称之为人次):

创建一个数据库迁移:

轨G型考勤

然后在你的迁移做这样的事情:

create_table :attendances do |t| 
    t.integer :attendee_id 
    t.integer :workshop_id 
end 

add_index :attendances, :attendee_id 
add_index :attendances, :workshop_id 
add_index :attendances, [:workshop_id, :attendee_id] 

所以,现在你有,你可以在许多与会者许多作坊关联的表你。

has_many :attending, through: :attendances, foreign_key: 'attendee_id', class_name: 'Workshop', source: :workshop 

在你的车间模型:

has_many :attendees, through: :attendances, class_name: 'User', source: :attendee  

所以现在 'some_user.attending' 将返回所有的车间some_user的ActiveRecord的关系出席,并

在您的用户模型

现在'some_workshop.attendees'会给你参加some_workshop的所有用户。

+0

准确推测我正在寻找什么!谢谢 –

+0

那么我该如何创建一个记录,以便它会显示在some_user.attending以及some_workshop.attendees中?有没有比'some_user.attending << some_workshop'和'some_workshop.attendees << some_user'更简单的方法? – Eric

+0

@Eric这就是我通常这样做,如果我已经创建了对象(即不属于属性) –