【问题标题】:How can i show only the results that have an association in rails 3?如何仅显示在 rails 3 中有关联的结果?
【发布时间】:2011-08-14 19:56:20
【问题描述】:

我正在尝试做一个 where 语句,它只显示具有该特定关联的结果。

例如:

公司通过公司状态具有多种状态。他们可以有多种状态,可以是金、银和/或青铜,或者根本没有。我试图让我的结果只返回具有状态(金、银和/或青铜)的公司,而不是那些没有状态的公司。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 where nested-includes


    【解决方案1】:

    您的用例没有很好地表达,但我认为您想要的是找到状态与指定状态匹配的公司:

    Company.includes(:statuses).where('status.name = ?', params[:status_name])
    

    假设公司has_many :statuses,这应该会为您提供正确的查询。

    【讨论】:

    • 很抱歉没有解释更多。我将编辑问题以解决它。我想要做的是只检索没有任何状态的公司。他们可以拥有金、银和/或青铜,也可以没有。我正在努力寻找至少拥有一种身份的公司。
    • 我不知道您是否可以将联接与is not null 结合使用。 ://
    • 是的,这就是让它变得艰难的原因。我不确定你会怎么做。我觉得必须有办法。这不可能那么罕见。
    • 试试Company.includes(:statuses).where('status.somecolumn IS NULL'),如果这不起作用,请分享它创建的查询(在您的日志中),我们也许可以从那里开始?
    • 好吧,我想我明白了。我不能真正发布结果,因为我没有使用那个确切的场景。我为这个问题简化了它。对于我的真实代码,我的用户拥有拥有经销商身份的公司。但我相信这两种方式都有效。 User.find(:all, :include => [:statuses], :conditions => ["statuses.id IS NOT NULL"])
    【解决方案2】:

    来自关于 Active Record 关联的 Ruby on Rails 指南:

    4.2.3 How To Know Whether There’s an Associated Object?
    

    要知道是否有和关联的对象只是检查 Association.nil?:

    如果@supplier.account.nil?

    @msg = "未找到此供应商的帐户"

    结束

    http://guides.rubyonrails.org/association_basics.html#detailed-association-reference

    【讨论】:

      【解决方案3】:
      Company.joins(:statuses).select("DISTINCT(companies.id), companies.*, statuses.*")
      

      【讨论】:

        【解决方案4】:

        如果您有一个名为 Companies_statuses 的关联表:

        检索具有至少一种状态的所有公司

        Company.where("EXISTS (select 1 from companies_statuses where companies_statuses.company_id = companies.id)")
        

        检索所有没有状态的公司

        Company.where("NOT EXISTS (select 1 from companies_statuses where companies_statuses.company_id = companies.id)")
        

        【讨论】:

          猜你喜欢
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-10
          • 1970-01-01
          相关资源
          最近更新 更多