#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. Спасибо, это была огромная помощь, я ценю, что вы нашли время ответить.