【问题标题】:Rails: select in an intricate relationshipRails:选择错综复杂的关系
【发布时间】:2013-04-12 10:15:55
【问题描述】:

我对 Rails 比较陌生,所以请您耐心等待。

我在三个(ActiveRecord)模型之间有一点错综复杂的关系:

class Producer
  has_many :clients
end  

class Client
  belongs_to :producer
  has_many   :products
end

class Product
  belongs_to :client
  belongs_to :producer
end

特定产品的生产者不一定与产品客户的生产者相同(但他可以)。

我需要以某种方式选择/限定生产者的所有产品,而他不是该产品客户的生产者。我无法解决这个问题。我试图按照 producer != producer.products.clients.producer 的方式思考,这当然行不通或有意义。

请帮忙?!

【问题讨论】:

    标签: ruby-on-rails select relationship named-scope


    【解决方案1】:
    Product.includes(:producer, :client).
       where("products.producer_id" => X).
       where( "clients.producer.id != products.producer_id")
    

    会根据需要从生产者那里找到 id X 的产品。

    【讨论】:

    • Not 关键字和最后一个右括号出现语法错误。 /app/controllers/producers_controller.rb:6: 语法错误,意外 tCONSTANT,期待 ')' ...这里(“clients.producer.id”不是 =>“products.producer_id”)... ^ /app/controllers /producers_controller.rb:6: 语法错误,意外的')',期待keyword_end ... Not => "products.producer_id") ... ^
    • 好的,这不会导致语法错误,但会爆炸,因为我没有提到客户端和生产者都是单个表继承中的联系人子类......对不起。我必须使用不同的类型属性(一个生产者一个客户)进行某种自我加入。
    【解决方案2】:
    @products = Product.select("products.*").joins(:clients).joins(:producers).where("products.producer_id = ? AND clients.producer_id != ?", producer_id, producer_id)
    

    应该会给你所需的结果。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      相关资源
      最近更新 更多