如何对两个不同的模型使用 where 方法?

How to use the where method with two different models?

大家好,我有一个问题, 例如我有一个模型 Product 谁有 :title, :description, :category_id。和产品 belongs_to :category 我有一个模特 Category,她有 :name。并且 has_many :products

我正在尝试做一个范围,谁将在何处使用该方法。例如,我尝试 Product.where(category_id: 2) 并且我拥有所有使用 id=2 保存的产品。 但我的问题是我是否想在使用 category.name: 'some_category' 的地方加入子句。我该怎么办?

您可以使用 joinsreferences

Product.joins(:category).references(:category).where("categories.name = ?", "a name")
Product.joins(:category).where(categories: { name: string_or_array_of_names })

使用 string_or_array_of_names 作为变量

#app/models/product.rb
class Product < ActiveRecord::Base
   scope :by_category, ->(name) { joins(:category).where(categories: {name: name}) }
end

这将允许您调用:

@cars = Product.by_category("cars")

我找到了我想做的事情的最佳答案并且知道我想在这里分享,首先我安装了一个 gem has_scope.

然后在我的产品模型中,我执行以下范围:

scope :category, -> category_id {where(:category_id => category_id)}

然后在 products_controller 我输入:

has_scope :category 

def index
    @products = apply_scopes(Product).all
end

然后在我的导航栏中我把这个 links:

<li><%= link_to 'Oils', category: 1 %></li>
<li><%= link_to 'Wines', category: 2 %></li>

这样可以按类别仅显示这些类型的产品。 但是这样做有问题! 如果您首先单击 Products.path 将显示所有产品,然后单击这些 link 将正常工作。 但是当我点击其他 link 比如 Contact.path 然后点击 Oils link 它会显示在导航器中 /contact?category=1 然后不会像我想要的那样显示过滤的产品.

那么解决这个问题的方法是:

<li><%= link_to 'Azeites', '/products?category=1' %></li>
<li><%= link_to 'Vinhos', '/products?category=2' %></li>

而且每次点击都会完美显示,非常简单和练习。谢谢各位帮帮我!