菜单项
class MenuItem < ActiveRecord::Base
has_many :menu_tags
end
菜单标签
class MenuTag < ActiveRecord::Base
belongs_to :menu_item
end
迁移:
class CreateMenuItems < ActiveRecord::Migration
def change
create_table :menu_items do |t|
t.string :name
t.string :description
end
end
end
class CreateMenuTags < ActiveRecord::Migration
def change
create_table :menu_tags do |t|
t.string :name
t.integer :menu_item_id
t.timestamps null: false
end
end
end
如何更改此迁移,以便在运行菜单项查询时,我可以看到与之关联的所有菜单标记?期望的查询:
MenuItem.first = #<MenuItem id: 2, name: "Steak", description: "Shank, medium-rare", menu_tags = [#<MenuTag id: 1, name: "Spicy">, #<MenuTag id: 4, name: "Salty">], created_at: "2016-07-18 02:54:55", updated_at: "2016-07-18 02:54:55">
答案 0 :(得分:2)
已经使用ActiveRecord,您可以通过调用以下内容来查看所有相关模型:
MenuItem.first.menu_tags
问题是,如上所述,数据库查询可能效率不高。要解决这些问题,ActiveRecord提供了eager_load关联的方法:
MenuItem.includes(:menu_tags).first.menu_tags
从ActiveRecord / Database的角度来看,这是更有效的。
您可以快速观察到的一件事是,当您致电时,相关型号未显示在您的控制台中:
MenuItem.first = #<MenuItem id: 2, name: "Steak", description: "Shank, medium-rare", menu_tags = [#<MenuTag id: 1, name: "Spicy">, #<MenuTag id: 4, name: "Salty">], created_at: "2016-07-18 02:54:55", updated_at: "2016-07-18 02:54:55">
这是因为ActiveRecord#inspect方法的默认行为是显示模型的属性,而不添加关联模型的属性。你可以look this up in the source code here..
注意:您可以通过覆盖此inpect方法来定义自己的行为,以包含关联的对象。
希望有所帮助。