Ruby on rails 如何通过Rails中的另一个模型访问关联模型?
更新(具体和更详细的先前版本如下): 我正在开发一个电视台网站。以下是我的课程部分的要求:Ruby on rails 如何通过Rails中的另一个模型访问关联模型?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,更新(具体和更详细的先前版本如下): 我正在开发一个电视台网站。以下是我的课程部分的要求: 每个程序都有一个类别 每个程序都有一个子类别 每个类别都有许多子类别 每个类别都有许多程序 每个子类别都有一个类别 每个子类别都有许多程序s 我想检索所有这三个要关联的模型。例如,我应该能够从我的视图中检索以下数据: 而: p = Program.find(1) p_cat = ProgramCategory.find(1) p_subcat = ProgramSubcategory.find(1) 我
程序
都有一个类别
程序
都有一个子类别类别
都有许多子类别
类别
都有许多程序
子类别
都有一个类别
子类别
都有许多程序
sp = Program.find(1)
p_cat = ProgramCategory.find(1)
p_subcat = ProgramSubcategory.find(1)
我应该能够检索并编辑以下内容:
p.program_category
p.program_subcategory
或
您可以在下面看到我为达到这些要求所做的尝试。你可以向我推荐一种完全不同的方法,或者纠正我的错误
多谢各位
============================================================
我有三种型号。它们应该相互嵌套
程序类别>程序子类别>程序
这是我的密码:
程序类别模型:
has_many :programs
has_many :program_subcategories
belongs_to :program_category
has_many :programs
程序子类别模型:
has_many :programs
has_many :program_subcategories
belongs_to :program_category
has_many :programs
程序模型:
belongs_to :program_category
belongs_to :program_subcategory
当我创建一个新程序时,我可以设置它的类别,一切都很好。我可以从两侧访问它们。比如说,
program.program_category
给了我我所期望的。而且
program_category.programs
也给了我想要的
但是,问题来了-
当我试图访问program.program\u子类别时,我只收到一个nil
即使设置了我的子类别,也设置了我的程序类别,为什么我不能直接访问Program.Program\u子类别
当我键入program\u category.program\u subcategories
时,我会收到该类别拥有的所有子类别。但是我不能直接从程序
对象中获取子类别
我的计划如下。任何帮助都是值得的
ActiveRecord::Schema.define(:version => 20120926181819) do
create_table "program_categories", :force => true do |t|
t.string "title"
t.text "content"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "program_subcategories", :force => true do |t|
t.integer "program_category_id"
t.string "title"
t.text "content"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
add_index "program_subcategories", ["program_category_id"], :name => "index_program_subcategories_on_program_category_id"
create_table "programs", :force => true do |t|
t.integer "program_category_id"
t.integer "program_subcategory_id"
t.string "title"
t.text "content"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
add_index "programs", ["program_category_id", "program_subcategory_id"], :name => "my_join1", :unique => true
end
这个设计有点奇怪。如果你需要像这样筑巢
ProgramCategory > ProgramSubcategory > Program
那你需要
class Program < ActiveRecord::Base
belongs_to :program_subcategory
end
class ProgramSubcategory < ActiveRecord::Base
belongs_to :program_category
has_many :programs
end
class ProgramCategory < ActiveRecord::Base
has_many :programs, :through => :program_subcategories
has_many :program_subcategories
end
现在是 我应该能够检索并编辑以下内容:
p.program_category
p.program_subcategory
p、 程序类别
想象一下,你有一个类别电影的子类别喜剧节目
您表示希望能够直接编辑程序类别(如果我理解正确),如下所示:
p.program_category = ProgramCategory.find_by_name("Sports")
那个么,你们期望程序的子类别是什么呢?一旦运动有许多子类别?你希望它是空白的吗
因此,在本设计中,更改程序类别的唯一方法是更改程序的子类别:
p.program_subcategory = ProgramSubcategory.find_by_name("Tennis")
这将是曼克项目的分类==体育,因为网球属于体育
注意:如果您确实希望有时直接更改程序的类别,将其子类别留空,当然需要另一种设计。我不认为这很难,但它需要更多的工作,而Rails AR Associations magic的帮助更少。您是否尝试了program_subcategory.program以列出该子类别下的所有程序?我尝试了program_subcategory.programs。它也给零。如果我手动将Subcategory设置为program object,它可能会给我程序对象;但我希望它是从分类模型中收集的。因为类别模型知道它有子类别。类别知道它有哪些子类别,但它不知道程序属于这些子类别中的哪一个。在您的设计中,
程序
的类别和子类别都有外键,因此每个程序可以分别属于某个类别和某个子类别。看看我对嵌套设计的回答。我明天会在办公室试用,并通知你结果,谢谢你的建议!“属于”怎么可能有“通过”选项?当然,当我执行你所说的一切时,我有一个ArgumentError:Unknown key:through
错误。结果:不可能。哦,你完全正确,对此感到抱歉。我编辑了答案。您可以通过关联删除错误的所属对象。但您仍然可以通过program.program\u subcategory.program\u category
Nope>访问程序子类别的类别。。。它不起作用。现在,即使是程序。程序类别也会给出一个错误。好的,我明白了。请告诉我,您是否希望程序的类别始终等于程序的子类别?