我有以下恋情
class Invoice
has_many :entries
has_many :price_matrixes, through: entries
end
class Entry
belongs_to :invoice
belongs_to :price_matrix
end
class PriceMatrix
has_many :entries
has_many :invoices, through: entries
end
现在,我有一组price_matrix ID,例如[1,2],我想查找仅具有这两个价格矩阵的所有发票。
注意:尝试过此Invoice.includes(:price_matrixes).where(price_matrixes: {id: [1, 2]})
,但即使列表中的一个ID匹配,也应该返回记录。
答案 0 :(得分:1)
使用普通SQL可以轻松解决任务。假设您使用的是PostgreSQL 9+,这是SQL查询以获取与您的条件相匹配的发票ID(仅具有ID为[1、2]的价格矩阵):
SELECT I.id
FROM invoices I
JOIN entries E ON E.invoice_id = I.id
GROUP BY I.id
HAVING array_agg(E.price_matrix_id ORDER BY E.price_matrix_id ASC) = ARRAY[1,2];
在这里我们加入invoices
和entries
,将结果按invoice.id
分组,并仅过滤那些给出price_matrix_ids
的结果。请注意,ARRAY[1,2]
表达式应包含price_matrix_ids
,以升序排序。
在线演示:http://rextester.com/TAEUU9220
回到Ruby,这是代码:
price_matrix_ids = [1,2].sort
Invoice.joins(:entries).having("array_agg(entries.price_matrix_id ORDER BY entries.price_matrix_id ASC) = ARRAY[#{price_matrix_ids.join(',')}]").group('invoices.id')
答案 1 :(得分:0)
轨道> = 3.2
Invoice.includes(:price_matrix).where(price_matrix: {id: [1, 2]})
轨道<3.2
Invoice.joins(:price_matrix).where("price_matrix.id IN [1, 2]")
答案 2 :(得分:-1)
您可以使用where clause
和尝试过的Invoice
.joins('INNER JOIN entries on entries.invoice_id = invoices.id')
.where(entries: { price_matrix_id: [1, 2] })
。
#to wait rather than printing the time limit error
api = tweepy.API(auth, wait_on_rate_limit=True)