Rails - 指定哪个连接列

时间:2015-01-21 19:46:57

标签: mysql ruby-on-rails join activerecord

我有两个模型QuoteQuoteVersionQuote有许多QuoteVersionsQuoteVersion属于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模型上指定连接列,或者是否可能。

提前致谢。

1 个答案:

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

看起来很清楚你想要完成什么,所以我希望我的回答可以帮到你一点