У меня есть следующие модели:Rails ActiveRecord пересекаются запрос с has_many ассоциации
class Piece < ActiveRecord::Base
has_many :instrument_pieces
has_many :instruments, through: :instrument_pieces
end
class Instrument < ActiveRecord::Base
has_many :pieces, through: :instrument_pieces
has_many :instrument_pieces
end
class InstrumentPiece < ActiveRecord::Base
belongs_to :instrument
belongs_to :piece
end
И у меня есть следующий запрос:
Piece
.joins(:instrument_pieces)
.where(instrument_pieces: { instrument_id: search_params[:instruments] })
.find_each(batch_size: 20) do |p|
Где search_params[:instruments]
является массив. Проблема с этим запросом заключается в том, что он будет извлекать все части, которые имеют какие-либо инструменты, поэтому, если search_params[:instruments] = ["1","3"]
, запрос вернет части с ассоциацией приборов либо 1, либо 3, либо их обоих. Я бы хотел, чтобы запрос возвращал только те части, чьи ассоциации инструментов включали оба инструмента 1 и 3. Я читал документы, но я все еще не уверен, как это можно сделать ...
При использовании с несколькими значениями в search_params [: instruments] этот запрос ничего не возвращает ... – 23049581029
У вас на самом деле есть части, соответствующие обеим инструментам? Вы можете проверить полученный SQL-код в Rails. –
Yup. Я подозреваю, что проблема может заключаться в том, что объект 'instrument_pieces' имеет только два поля:: instrument_id' и': piece_id' и эти запросы для объекта 'instrument_pieces' с': instrument_id' обоих значений. Можно ли в этом случае выполнить пересечение запросов? – 23049581029