我有两个模型Quote
和QuoteVersion
。 Quote
有很多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
看起来不太清楚您要完成什么,所以希望我的回答对您有所帮助