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

标签 ruby-on-rails ruby

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]

但是

如果您想向转让者或受让人添加一些不同的功能,您应该考虑使用 STIMTI

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

相关文章:

ruby-on-rails - 更新到 Ruby 2.0 打破了我的 Assets 管道

css - RoR Assets 管道生成额外链接

ruby-on-rails - 启动 rails 时 bundler 中的 Minitest 4.7.5 错误

ruby-on-rails - rails : How do I convert a symbol to a class

ruby-on-rails - Rails 教程 : Undefined method errors in chapter 6

ruby-on-rails - OmniAuth 无效响应错误

ruby-on-rails - 重定向到实例在 Ruby on Rails 中意味着什么

ruby - 如何终止在 xterm 中执行的命令

ruby-on-rails - Ruby on Rails 教程 list 6.23 中的变量调用

ruby-on-rails - 为什么使用 Proc.new 来调用 Rails 回调中的方法?