通过Rails中的关联,找到所有子记录与给定列表中的所有子记录完全匹配的所有父母

时间:2018-10-04 06:27:49

标签: ruby-on-rails activerecord

我有以下恋情

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匹配,也应该返回记录。

3 个答案:

答案 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];

在这里我们加入invoicesentries,将结果按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)