我对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有一个与会者限制,所以我需要验证......
谢谢, 丹尼尔
答案 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的用户。