2016-07-18 2 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 

Как я могу изменить эту миграцию, так что если я выполнить запрос для Элемент меню, я вижу все связанные с ним теги меню? Желаемый запрос:

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' try this – uzaif

ответ

2

Уже с ActiveRecord, вы можете увидеть все связанные модели, называя что-то вроде:

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

Примечание: вы можете определить свое поведение, переопределив этот метод inpect, чтобы включить связанные объекты.

Надеюсь, что это поможет.

+0

Вау, спасибо за объяснение! Это очень помогло мне! – user3007294

Смежные вопросы