Rails 4 - 如何构建此模型关系?

时间:2015-06-09 02:10:20

标签: ruby-on-rails model-associations activemodel

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

class Task < ActiveRecord::Base
  has_many :guidelines
end

class Guideline < ActiveRecord::Base
  belongs_to :task
end

但是,我的理解是belongs_to会通过设置Guideline字段将Tasktask_id仅关联Guideline。这意味着,如果将给定Task分配给另一个has_and_belongs_to_many,则第一个关联将丢失。如果我错了,请纠正我。

我查看了Guidelines关系,但Tasks不能有任何Guidelines;他们只能属于很多任务。我目前有一个系统,我在一个数组中存储给定Task的所有选定for (var x = 0; x < addresses.length; x++) { (function(x){ //The list, which works correctly $("#listID").append("<li><img src='http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/marker" + (x + 1) + ".png' alt='marker'><strong>" + addresses[x].NAME + "</strong><br>" + addresses[x].ADDRESS + "<br></li>"); //Based off another SO answer, to populate the map based on addresses without having to look up lat/lng $.getJSON('http://maps.googleapis.com/maps/api/geocode/json?address='+addresses[x].ADDRESS +'&sensor=false', null, function (data) { var p = data.results[0].geometry.location; var latlng = new google.maps.LatLng(p.lat, p.lng); var image = 'http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/marker' + (x + 1) + '.png'; new google.maps.Marker({ position: latlng, icon: image, map: map }); }); })(x); } 的ID,但我更愿意使用内置关联。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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

要么工作。

答案 1 :(得分:0)

您可以使用has_and_belongs_to_many关联。它允许您制作如下内容:Task.first.guidlines(和Guidline.first.tasks,如果您需要)。

答案 2 :(得分:0)

您可以使用has_and_belongs_to_many关联

您的型号代码将是

class Task&lt;的ActiveRecord ::基

  has_and_belongs_to_many :guidelines

课程指南&lt;的ActiveRecord ::基

 has_and_belongs_to_many :tasks

此外,您还需要在名为guidelines_tasks的数据库中创建一个包含以下迁移代码的表 create_table:guidelines_tasks,id:false do | t |

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

end