在我的应用中,我有两个模型,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
会通过设置Guideline
字段将Task
与task_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,但我更愿意使用内置关联。
非常感谢任何帮助。
答案 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