我有两个模型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模型上指定连接列,或者是否可能。
提前致谢。
答案 0 :(得分:0)
只要我理解,那些"其他一些条件"是为了得到当前的报价版本,所以我认为你可以采用一种方法:
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
然后在你的报价模型中做这样的事情
def quote_version
self.quote_versions.not_approved.where(quote_versions: {id: quote_version_id})
end
看起来很清楚你想要完成什么,所以我希望我的回答可以帮到你一点