rails新手(使用4.1),制作一个小型项目管理工具作为学习项目。我遇到了一个稍微复杂的模型关联,我想确保我在正确的 rails 上,并询问如何扩展它。
考虑这种情况:
型号:
class Website < ActiveRecord::Base
has_many :website_user
has_many :users, through: :website_user
has_many :tasks, through: :website_user
end
class User < ActiveRecord::Base
has_many :websites, through: :website_user
has_many :website_user
end
class WebsiteUser < ActiveRecord::Base
belongs_to :website
belongs_to :user
belongs_to :role
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :website_user
has_one :website, through: :website_user
end
class Role < ActiveRecord::Base
has_many :website_user
end
数据库:
create_table "roles", force: true do |t|
t.string "name"
end
create_table "tasks", force: true do |t|
t.text "description"
t.string "title"
t.integer "website_user_id"
end
create_table "users", force: true do |t|
t.string "name"
t.string "email"
t.string "password"
t.string "password_hash"
t.string "password_salt"
end
create_table "website_users", force: true do |t|
t.integer "website_id"
t.integer "user_id"
t.integer "role_id"
end
create_table "websites", force: true do |t|
t.string "name"
t.string "url"
end
我在这里所做的基本上是网站通过 website_user 表获取关联的用户(在网站上工作的团队成员)。该表属于角色,因此团队成员在此网站上有特定的工作,最后,任务属于 website_user 关联,以便您可以换出用户,但任务将保持与角色和网站的关联。
我正在考虑对其进行更多扩展,以便该任务将在 website_user 上关联两次,一次用于分配者,一次用于任务的分配用户。然而,在这一点上,感觉就像我将有很多东西附加到中间的一个大连接表上,并且在我没有大量经验的情况下,它开始听起来像是可能有更好的方法。
如果这一切看起来不错,您如何将任务加入 website_user 两次,一次用于分配者,一次用于分配?或者,如何重新排列模型关联?
最佳答案
首先想到的一个简单解决方案是将分配者和受分配者 ID 保留在任务模型中。
迁移AddAssigneeAssignerToTask
class AddAssigneeAssignerToTask < ActiveRecord::Migration
change do
add_reference :task, :assignee, index: true
add_reference :task, :assigner, index: true
end
end
将belongs_to添加到任务模型中
class Task < ActiveRecord::Base
belongs_to :assignee, class: 'WebsiteUser'
belongs_to :assigner, class: 'WebsiteUser'
has_one :website, through: :assignee
end
修改WebsiteUser
class WebsiteUser < ActiveRecord::Base
belongs_to :website
belongs_to :user
belongs_to :role
has_many :assigned_tasks, class_name: 'Task', foreign_key: 'assigner_id'
has_many :received_tasks, class_name: 'Task', foreign_key: 'assignee_id'
end
所以之后你可以这样使用它
@website_user.assigned_tasks # => []
@website_user.received_tasks # => [Task1, Task2]
但是
关于ruby-on-rails - Rails 在单个表上连接多个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29754569/