Rails 4 - 我该如何构建这种模型关系?

Rails 4 - How do I structure this model relationship?

在我的应用程序中,我有两个模型,TaskGuideline。每个Task可以有多个Guidelines,每个Guideline可以属于多个Tasks。如果 ActiveRecord 甚至可能的话,我将如何建立这两个模型之间的关系?我考虑过这样构建它:

class Task < ActiveRecord::Base
  has_many :guidelines
end

class Guideline < ActiveRecord::Base
  belongs_to :task
end

但是,我的理解是 belongs_to 将通过设置其 task_id 字段将 Guideline 仅关联到一个 Task。这意味着,如果将给定的 Guideline 分配给另一个 Task,第一个关联将丢失。如有不妥请指正

我调查了 has_and_belongs_to_many 关系,但是 Guidelines 不能有任何 Tasks;他们只能属于许多任务。我目前有一个系统,其中我将给定 Task 的所有选定 Guidelines 的 ID 存储在一个数组中,但如果可能的话,我更愿意使用内置关联。

如有任何帮助,我们将不胜感激。

从根本上说,这仍然是一种 has_and_belongs_to_many 关系,具有连接 table:

+-------+     +-----------------+     +------------+
| Tasks |-----| GuidelinesTasks |-----| Guidelines |
+-------+     +-----------------+     +------------+

实际上,您的模型是一个指南有很多任务,任务有很多指南。指南“属于许多人”的事实是您如何解释它是一个与实际数据模型无关的纯粹应用程序级项目。

在 Rails 中,您可以根据 guidelines_tasks table 本身是否具有您希望跟踪的值,以多种方式对其进行建模。两者使用相同的数据结构:

# Migration
class AddTasksAndGuidelines < ActiveRecord::Migration
  def change
    create_table :tasks do |t|
      …
    end

    create_table :guidelines do |t|
      …
    end

    create_join_table :guidelines, :tasks
  end
end

有了这个,第一个模型就是经典has_and_belongs_to_many:

# habtm
class Tasks < ActiveRecord::Base
  has_and_belongs_to_many :guidelines
end

class Guidelines < ActiveRecord::Base
  has_and_belongs_to_many :tasks
end

第二个模型——如果GuidelinesTask有自己的属性是自反的has_many through::

class Tasks < ActiveRecord::Base
  has_many :guidelines_tasks
  has_many :guidelines, through: :guidelines_tasks
end

class GuidelinesTask < ActiveRecord::Base
  has_many :tasks
  has_many :guidelines
end

class Guidelines < ActiveRecord::Base
  has_many :guidelines_tasks
  has_many :tasks, through: :guidelines_tasks
end

两者都行。

您可以使用has_and_belongs_to_many关联。它允许你做这样的事情:Task.first.guidlines(和 Guidline.first.tasks,如果你需要的话)。

你可以使用has_and_belongs_to_many关联

您的型号代码将为

class 任务 < ActiveRecord::Base

  has_and_belongs_to_many :guidelines

结束

class 指南 < ActiveRecord::Base

 has_and_belongs_to_many :tasks

结束

您还需要使用以下迁移代码在名为 guidelines_tasks 的数据库中创建一个 table create_table :guidelines_tasks, id: false do |t|

  t.belongs_to :guideline, index: true
  t.belongs_to :task, index: true

end