【问题标题】:Rails - Specify which join columnRails - 指定连接列
【发布时间】:2015-01-21 19:46:56
【问题描述】:

我有两个型号QuoteQuoteVersionQuote有很多QuoteVersionsQuoteVersion属于QuoteQuote属于QuoteVersion,因为我希望能够通过调用current_version得到current_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 }),里面包含了hash格式的所有条件,只是不知道怎么在Quote模型上指定join列,或者是否可以。

提前致谢。

【问题讨论】:

    标签: mysql ruby-on-rails join activerecord


    【解决方案1】:

    据我了解,那些“其他几个条件”是为了得到当前的报价版本,所以我认为你可以用一个方法:

    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
    

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

    【讨论】:

    • 其他条件是判断报价是否在审核、批准等。所以我首先想确保我可以使用一种干净的方式来获得Quote.joins(:quote_versions).where("quote_versions.id = quotes.quote_version_id") 部分的权利。其余条件非常简单。
    • 正如我在回答中提到的,我看到的最“干净”的解决方案是使用范围。至于您的初始查询,我建议您使用 belongs_to
    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多