2015-06-09 19 views
1

在我的应用程序中,我有两个模型,TaskGuideline。每个Task可以有许多Guidelines,并且每个Guideline可以属于许多Tasks。我如何建立这两个模型之间的关系,如果它甚至可能与ActiveRecord?我曾经想过将其结构如下所示:Rails 4 - 如何构建这种模型关系?

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,但是如果可能的话,我宁愿使用内置关联。

任何帮助将不胜感激。

+0

多对多的关系? =) http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association – Gerep

回答

1

这仍然是从根本上has_and_belongs_to_many关系,连接表:

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

在现实中,你的模型是一个准则有许多任务,以及有许多指导任务。指南“属于许多”的事实是您如何解释它是纯粹的应用程序级别的项目,它与实际的数据模型没有任何关系。

在Rails中,您可以根据您的guidelines_tasks表本身是否具有您希望跟踪的值来建立几种模型。两者都使用相同的数据结构:

# 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 

要么会工作。

+0

谢谢你的解释,尤其是解释部分!我正在考虑这个问题,而且我没有意识到它有'has_and_belongs_to_many'的关系。我会在哪些模型中指定关联?都? – Alexander

+0

你会把它放在两个。我已经扩展了这个答案,为此提供了几个不同的选项。可以工作,但无论如何,都需要一个额外的模型面向所需的表格。 –

+0

非常感谢您的帮助! – Alexander

0

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

0

您可以使用has_and_belongs_to_many协会

你的模型代码会

类任务<的ActiveRecord :: Base的

has_and_belongs_to_many :guidelines 

类指引<的ActiveRecord :: Base的

has_and_belongs_to_many :tasks 

还需要创建名为guidelines_tasks数据库中的表下面的迁移代码 CREATE_TABLE:guidelines_tasks,ID:假做| T |

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

end