我有两个模型QuoteQuoteVersionQuote有很多QuoteVersions,并且QuoteVersion属于Quote,并且Quote属于QuoteVersion,因为我希望能够通过调用current_version来获得quote.quote_version,并且算法得到通过调用quote.quote_versions所有版本。这个设计好吗?我发现使用quote.quote_versions.last查找current_version很脏。有什么想法吗?

我需要创建一个查询以仅获取当前版本,我知道可以使用以下操作:

Quote.joins(:quote_versions).where("quote_versions.id = quotes.quote_version_id")

,但是有没有一种更清洁的方法?我需要包括其他几个条件,例如:
Quote.joins(:quote_versions).where("quote_versions.id = quotes.quote_version_id").where(quote_versions: { approver_id: nil, approved: nil })

我认为能够执行以下操作会更清洁:

Quote.joins(:quote_versions).where(quote_versions: { id: :quote_version_id, approver_id: nil, approved: nil })(包括哈希格式中的所有条件),我只是不知道如何在Quote模型上指定联接列,或者是否可能。

提前致谢。

最佳答案

据我了解,那些“其他一些条件”是要获得当前的报价版本,所以我认为您可以使用以下方法:

def quote_version
 Quote.joins(:quote_versions).where(quote_versions: {...} ).where(quote_id: self.id)
end


现在,如果您想稍微清理一下,可以在QuoteVersion模型中使用范围:

class QuoteVersion < ActiveRecord::Base
  scope :not_approved, ->{where(approved_id: nil,approved:nil)}
end


然后在Quote模型中执行类似的操作

def quote_version
  self.quote_versions.not_approved.where(quote_versions: {id: quote_version_id})
end


看起来不太清楚您要完成什么,所以希望我的回答对您有所帮助

10-07 16:49