具有多个且属于RAILS 3的复杂查询

|| 我试图在控制器中进行查询,以获取具有类别ID的供应商列表。 我有这样的模型设置。
  class Supplier < ActiveRecord::Base
    has_and_belongs_to_many :sub_categories
  end

  class Category < ActiveRecord::Base
    has_many :sub_categories
  end

  class SubCategory < ActiveRecord::Base
    belongs_to :category
    has_and_belongs_to_many :suppliers
  end
供应商可以具有一个子类别下的许多子类别。这样我就可以抓住供应商的类别。
  @supplier.sub_categories.first.category.name
这将返回供应商所属的类别,因为他们必须至少具有1个子类别,然后再链接到该类别。 我想做的是通过传递一个category_id,我希望返回该类别下的所有供应商。 我把它写成这样,但似乎没有用。
  @category = Category.find(params[:category_id])
  @suppliers = Supplier.where(\'sub_category.first.category.id = ?\', @category.id)
我得到以下SQL错误
  Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'.id = 20)\' at line 1: SELECT     `suppliers`.* FROM       `suppliers`  WHERE     (sub_category.first.category.id = 20)
    
已邀请:
        好吧,那肯定是一个SQL错误。 where()调用中的内容直接转换为SQL,而不是sq; l。 :) 您需要将表联接在一起。我假设存在一个完成habtm关联的sub_category_suppliers表。 (顺便说一句,我更喜欢只使用has_many:through) 我认为应该是这样的:
Supplier.joins(:sub_category_suppliers => :sub_categories).
         where(\'sub_categories.category_id =?\', @category.id).
         group(\'suppliers.id\')
正如Caley Woods所建议的那样,应将其放置在Supplier模型中作为范围:
scope :by_category, lambda { |category_id|
  joins(:sub_category_suppliers => :sub_categories).
         where(\'sub_categories.category_id =?\', category_id).
         group(\'suppliers.id\')
}
然后称为
Supplier.by_category(@category.id)
    

要回复问题请先登录注册