2014-08-28 1 views
-3

мне нужна ваша помощь:has_many вообще не получает все, когда включает в себя (: объединение) .где ("? Association.something =", значение)

У меня есть три модели:

Фонограмма has_many PhonogramInstrument:

class Phonogram < ActiveRecord::Base 
    #... things 
    has_many :phonogram_instruments, source: :filter, dependent: :destroy, inverse_of: :phonogram 
    has_many :instruments, source: :filter, through: :phonogram_instruments 
end 

PhonogramInstrument belongs_to Фильтр:

class PhonogramInstrument < ActiveRecord::Base 
    belongs_to :phonogram 
    belongs_to :filter 
end 

и Фильтр:

class Filter < ActiveRecord::Base 

end 

Итак, мне нужно, чтобы извлечь все фонограммы, которые filter_id 30, например:

@phonograms = @phonograms.includes(:phonogram_instruments).where("phonogram_instruments.filter_id = ?", 30) 

, который получает мне один список с одним объектом (именно то, что я, как ожидалось):

=> [#<Phonogram id: 14, title: "Test", version_title: "", notes: nil, isrc: "BR3BD1300003", release_date: "2013-02-01", created_at: "2014-02-23 16:54:24", updated_at: "2014-08-27 03:19:08">] 

... но если я возьму этот объект и покажу его инструмент:

@phonograms.first.phonogram_instruments.inspect 
=> #<ActiveRecord::Associations::CollectionProxy [#<PhonogramInstrument id: 51, phonogram_id: 14, filter_id: 30, created_at: "2014-08-27 07:01:27", updated_at: "2014-08-27 07:01:27">]> 

, но в этой фонограмме у меня есть 7 PhonogramInstruments:

Phonogram.find(14).phonogram_instruments.inspect 
=> "#<ActiveRecord::Associations::CollectionProxy [ 
#<PhonogramInstrument id: 25, phonogram_id: 14, filter_id: 25, created_at: \"2014-06-04 06:11:14\", updated_at: \"2014-06-04 06:11:14\">, 
#<PhonogramInstrument id: 26, phonogram_id: 14, filter_id: 26, created_at: \"2014-06-04 06:11:14\", updated_at: \"2014-06-04 06:11:14\">, 
#<PhonogramInstrument id: 48, phonogram_id: 14, filter_id: 49, created_at: \"2014-08-27 03:19:07\", updated_at: \"2014-08-27 03:19:07\">, 
#<PhonogramInstrument id: 49, phonogram_id: 14, filter_id: 50, created_at: \"2014-08-27 03:19:08\", updated_at: \"2014-08-27 03:19:08\">, 
#<PhonogramInstrument id: 50, phonogram_id: 14, filter_id: 29, created_at: \"2014-08-27 07:01:27\", updated_at: \"2014-08-27 07:01:27\">, 
#<PhonogramInstrument id: 51, phonogram_id: 14, filter_id: 30, created_at: \"2014-08-27 07:01:27\", updated_at: \"2014-08-27 07:01:27\">, 
#<PhonogramInstrument id: 52, phonogram_id: 14, filter_id: 31, created_at: \"2014-08-27 07:01:27\", updated_at: \"2014-08-27 07:01:27\"> 
]>" 

Помогите пожалуйста! :)

+0

Существует только одна функция PhonogramInstrument, соответствующая состоянию phonogram_id 14 и filter_id 30, поэтому ответ Илрейна был прав. –

+0

Но фонограмма № 14 имеет 7 PhonogramInstrument, а где приносит мне ActiveRecord :: Ассоциации :: CollectionProxy с моей фонограммой № 14 с 1 фонограммойИнструмент –

+0

Можете ли вы выполнить свой код '@ phonograms.includes (: phonogram_instruments) .where (" phonogram_instruments .filter_id =? ", 30)' в контроллере rails? И запустите SQL, сгенерированный рельсами, в окне командной строки базы данных. Вы можете опубликовать SQL и результат по вашему вопросу. –

ответ

2

Вы явно не задавали вопрос. В чем проблема? Я вижу, что вы указываете, что на фонограмме № 14 связано с ней 7 объектов, а на фонограмме №1 связан с ней 1 объект (где для идентификатора фильтра установлено значение 30).

Все, кажется, идет, как ожидалось ...

+0

Оба объекта фонограммы одинаковы # 14 –

4

Попробуйте joins вместо includes:

@phonograms = Phonogram.joins(:phonogram_instruments).where("phonogram_instruments.filter_id = ?", 30) 

смотри раздел преднагрузки здесь

http://blog.arkency.com/2013/12/rails4-preloading/

+0

Я пробовал. У меня была ошибка, потому что предыдущие @phonograms включали другие ассоциации –

0

Готово!

Моя ошибка была, потому что мой предыдущий список был в том числе и других ассоциаций с включает в себя():

@phonograms = @phonograms.includes([:artists, :partners, :labels, :albums]).where(...) 

Когда я попытался использовать

@phonograms.joins("phonogram_instruments").where(...) 

... Я получил сообщение об ошибке возле слова " phonogram_instruments ", плавающий только по моему запросу.

Итак, я положил руководство LEFT OUTER JOIN на мой запрос:

@phonograms = @phonograms.joins("LEFT OUTER JOIN \"#{listed_filter.type}\" \"#{listed_filter.type}_phonograms\" ON \"#{listed_filter.type}_phonograms\".\"phonogram_id\" = \"phonograms\".\"id\"").where("#{listed_filter.type}_phonograms.filter_id = ?", listed_filter.id) 

Это работает! Спасибо всем!