Rails 3: Запрос из связанных таблиц - PullRequest
0 голосов
/ 31 мая 2011

Я очень новичок в Ruby on Rails 3 и ActiveRecord и, кажется, был добавлен в работу. Я изо всех сил пытаюсь справиться с запросом данных из нескольких таблиц с помощью объединений.

Многие примеры, которые я видел, либо основаны на гораздо более простых запросах, либо используют синтаксис

Учитывая, что я знаю business_unit_group_id и у меня есть следующие ассоциации, как бы я запросил список всех связанных Item и ItemSellingPrices?

class BusinessUnitGroup < ActiveRecord::Base
  has_many :business_unit_group_items
end

class BusinessUnitGroupItem < ActiveRecord::Base
  belongs_to :business_unit_group
  belongs_to :item
  belongs_to :item_selling_price
end

class Item < ActiveRecord::Base
  has_many :business_unit_group_items
end

class ItemSellingPrice < ActiveRecord::Base
  has_many :business_unit_group_items
end

Я не совсем понимаю, нужно ли мне подробно указывать какие-либо объединения в запросе, поскольку связи существуют.

1 Ответ

1 голос
/ 31 мая 2011

Как правило, вам не нужно указывать объединения:

 # This gives you all the BusinessUnitGroupItems for that BusinessUnitGroup
 BusinessUnitGroup.find(id).business_unit_group_items

 # BusinessUnitGroupItem seems to be a rich join table so you might
 # be iterested in the items directly:
 class BusinessUnitGroup < ActiveRecord::Base
   has_many :items through => :business_unit_group_items
   # and/or
   has_many :item_selling_prices, through => :business_unit_group_items
   ...
 end
 # Then this gives you the items and prices for that BusinessUnitGroup:
 BusinessUnitGroup.find(id).items
 BusinessUnitGroup.find(id).item_selling_prices

 # If you want to iterate over all items and their prices within one 
 # BusinessUnitGroup, try this:
 group = BusinessUnitGroup.include(
   :business_unit_group_item => [:items, :item_selling_prices]
 ).find(id)
 # which preloads the items and item prices so while iterating,
 # no more database queries occur
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...