2016-07-18 9 views
0

MenüpunktModell Verbände in Rails has_many und belongs_to

class MenuItem < ActiveRecord::Base 
    has_many :menu_tags 
end 

Menü Stichworte

class MenuTag < ActiveRecord::Base 
    belongs_to :menu_item 
end 

Migrationen:

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 

Wie kann ich diese Wanderung so ändern, wenn ich eine Abfrage ausführen, für einen Menüpunkt, kann ich alle damit verbundenen Menu Tags sehen? Gewünschte Abfrage:

MenuItem.first.menu_tags 

Problem ist, mit den oben genannten, die Datenbankabfrage kann nicht effizient genug sein:

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' versuchen Sie dies – uzaif

Antwort

2

Bereits mit Activerecord können Sie alle zugehörigen Modelle durch den Aufruf etwas wie sehen. Zur Lösung dieser Active Methoden bietet die Assoziationen eager_load:

MenuItem.includes(:menu_tags).first.menu_tags 

Dieses effizienten aus einer Active/Datenbank Perspektive.

Eine Sache, die Sie schnell bemerken würde, ist, dass das zugehörige Modell nicht in der Konsole angezeigt, wenn Sie anrufen:

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

Dies liegt daran, das Standardverhalten der Active # inspizieren Verfahren die Eigenschaften zu zeigen, des Modells, ohne die der zugehörigen Modelle hinzuzufügen. Sie können look this up in the source code here..

Hinweis: Sie können Ihr eigenes Verhalten definieren, indem Sie diese inpect-Methode überschreiben, um die verknüpften Objekte einzuschließen.

Hoffe, dass hilft.

+0

Wow, vielen Dank für die Erklärung! Das hat mir enorm geholfen! – user3007294