Ruby数据建模有两种方式的关系

时间:2012-06-27 17:04:19

标签: ruby-on-rails-3 rails-activerecord

我对Ruby中的某个数据模型有疑问。我有一套业务要求:

用户可以创建许多工作坊

用户可以参加许多研讨会

Workshop有一个所有者(用户)

工作坊有很多与会者(用户)

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

#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:与会者?

您对此有何看法?更糟糕的是,Workshop有一个与会者限制,所以我需要验证......

谢谢, 丹尼尔

1 个答案:

答案 0 :(得分:3)

你有一个has_many到has_many的关系,所以你需要创建一个新的关联表来关联这些关系(让我们称之为出勤):

创建数据库迁移:

  

rails g model attendance

然后在迁移中执行以下操作:

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的用户。