gpt4 book ai didi

ruby-on-rails - Rails 在一个表上连接多个模型

转载 作者:数据小太阳 更新时间:2023-10-29 08:45:35 24 4
gpt4 key购买 nike

新接触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添加到Task模型

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]

但是

如果你想为分配者或受让人添加一些不同的功能,你应该考虑使用 STIMTI

关于ruby-on-rails - Rails 在一个表上连接多个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29754569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com