Rails 3: Выполнение запросов из связанных таблиц

#ruby-on-rails #ruby-on-rails-3 #activerecord

#ruby-on-rails #ruby-on-rails-3 #activerecord

Вопрос:

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

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

Учитывая, что я знаю business_unit_group_id и имею следующие ассоциации, как мне запросить список всех связанных элементов и 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:

В принципе, вам не нужно указывать соединения:

  # 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
  

Комментарии:

1. Спасибо, это была огромная помощь, я ценю, что вы нашли время ответить.