2016-07-18 14 views
0

メニュー項目中のモデルアソシエーションRailsのHAS_MANYとBELONGS_TO

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 

メニュー項目、それに関連するすべてのメニュータグを見ることができますか?目的のクエリ:ActiveRecordを持つすでに

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

'MenuItem.joins(:Menutag).all'これを試してください – uzaif

答えて

2

、あなたのような何かを呼び出すことによって、関連するすべてのモデルを見ることができます:

MenuItem.first.menu_tags 

問題は、上記で、データベースクエリが十分に効率的ではないかもしれない、です。これらを解決するために、ActiveRecordは関連をeager_loadするメソッドを提供しています。

MenuItem.includes(:menu_tags).first.menu_tags 

これは、ActiveRecord /データベースの観点から、より効率的です。あなたはすぐに観察したい

一つは、関連するモデルは、あなたが呼び出すときに、あなたのコンソールに表示されていないということです。

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#のデフォルトの動作は、メソッド、プロパティを表示することです調べるためです関連するモデルのモデルを追加することなく、 look this up in the source code here..

注:このインビューメソッドをオーバーライドして、関連するオブジェクトを含めることで、独自の動作を定義できます。

希望に役立ちます。

+0

うわー、説明にはとても感謝します!それは私を大いに助けました! – user3007294

関連する問題