Rails Has_many和Belongs_to中的模型关联

时间:2016-07-18 03:16:54

标签: ruby-on-rails migration associations

菜单项

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">

1 个答案:

答案 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方法来定义自己的行为,以包含关联的对象。

希望有所帮助。