has_many ассоциация с выбором

все! Я хочу создать дополнительное отношение has_many для выбора только необходимых столбцов

Пример

class Price < ActiveRecord::Base
  self.table_name = "pricelist_prices"
  has_many :order_items, :primary_key=> :city_id, :foreign_key=> :city_id
  has_many :orders, :through => :order_items   
end

так это работает сейчас. Но я хотел бы создать ассоциацию, которая работает как :orders, но имеет опцию :select

Пример

has_many :orders, :through => :order_items, :select=>"price"

Но я не хочу переопределять текущую связь :orders. Как это сделать?

UPD Азото покажи пример с исходным кодом! Это нормально, но когда я использую это согласование в include , оно не работает.

 Price.where(:id=>[12759,12758]).includes(:prices_from_orders)
   (Object doesn't support #inspect)

   Price.where(:id=>[12759,12758]).includes(:prices_from_orders).first
NoMethodError: undefined method `each' for nil:NilClass
    from /Users/igorfedoronchuk/.rvm/gems/ruby-1.9.2-p180@new/gems/activerecord-3.2.1/lib/active_record/associations/preloader/association.rb:88:in `block in associated_records_by_owner'

UPD2

Я понял проблему, если вы хотите использовать такую ​​ассоциацию в методе include, также добавьте выбор primary_key, иначе AR не знает, кто является владельцем записи.

has_many :orders, :through => :order_items, :select=>"id, price"

person Fivell    schedule 07.02.2012    source источник


Ответы (2)


Вы можете создать новый relation по цене select.

has_many :price_of_orders, :through => :order_items,
                           :source => orders,
                           :select => :price

ИЛИ

Как насчет расширения ассоциации?

has_many :orders, :through => :order_items do
  def just_price
    select(:price)
  end
end

Тогда вы могли бы сделать что-то вроде @price.orders.just_price

person Azolo    schedule 07.02.2012
comment
Благодарность! Оно работает ! Но когда я использую его во включении, возникает ошибка (обновленный вопрос - person Fivell; 08.02.2012

Чтобы сделать это в Rails 4 и более поздних версиях, используйте следующий код:

has_many :order_prices, -> {
  select('orders.price')
} :through => order_items
person Ceasar Bautista    schedule 08.10.2019