Mysql Rails-指定哪个连接列
我有两种型号Mysql Rails-指定哪个连接列,mysql,ruby-on-rails,join,activerecord,Mysql,Ruby On Rails,Join,Activerecord,我有两种型号Quote和QuoteVersionQuote有许多QuoteVersion,而QuoteVersion属于Quote,而Quote属于QuoteVersion,因为我希望能够通过调用Quote>来获取当前版本,和algo通过调用quote.quote\u versions获取所有版本。这个设计好吗?我发现使用quote.quote\u versions.last查找当前版本很麻烦。想法 我需要创建一个查询以仅获取当前版本,我知道我可以使用以下方法执行此操作: Quote.joins
Quote
和QuoteVersion
Quote
有许多QuoteVersion
,而QuoteVersion
属于Quote
,而Quote
属于QuoteVersion
,因为我希望能够通过调用Quote>来获取当前版本,和algo通过调用quote.quote\u versions
获取所有版本。这个设计好吗?我发现使用quote.quote\u versions.last
查找当前版本很麻烦。想法
我需要创建一个查询以仅获取当前版本,我知道我可以使用以下方法执行此操作:
Quote.joins(:Quote\u versions)。其中(“Quote\u versions.id=quotes.Quote\u version\u id”)
,但有没有更干净的方法?我需要包括几个其他条件,比如:
Quote.joins(:Quote\u versions)。其中(“Quote\u versions.id=quotes.Quote\u version\u id”)。其中(Quote\u versions:{approver\u id:nil,approved:nil})
我认为能够做以下事情会更干净:
Quote.joins(:Quote\u versions).where(Quote\u versions:{id::Quote\u version\u id,approver\u id:nil,approved:nil})
,其中包括散列格式中的所有条件,我只是不知道如何在报价模型上指定join列,或者如果可能的话
提前感谢。据我所知,这些“其他几个条件”旨在获得当前报价版本,因此我认为您可以采用以下方法:
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.joins(:Quote\u versions)。where(“Quote\u versions.id=quotes.Quote\u version\id”)
零件右侧。其余的条件都很简单。正如我在回答中提到的,我看到的最“干净”的解决方案是使用范围。至于您最初的查询,我建议您选择
def quote_version
self.quote_versions.not_approved.where(quote_versions: {id: quote_version_id})
end