Rails 4 - 我该如何构建这种模型关系?
Rails 4 - How do I structure this model relationship?
在我的应用程序中,我有两个模型,Task
和 Guideline
。每个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
在我的应用程序中,我有两个模型,Task
和 Guideline
。每个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