如何对两个不同的模型使用 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'
的地方加入子句。我该怎么办?
您可以使用 joins
和 references
。
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>
而且每次点击都会完美显示,非常简单和练习。谢谢各位帮帮我!
大家好,我有一个问题,
例如我有一个模型 Product
谁有
:title, :description, :category_id
。和产品 belongs_to :category
我有一个模特 Category
,她有 :name
。并且 has_many :products
我正在尝试做一个范围,谁将在何处使用该方法。例如,我尝试 Product.where(category_id: 2)
并且我拥有所有使用 id=2 保存的产品。
但我的问题是我是否想在使用 category.name: 'some_category'
的地方加入子句。我该怎么办?
您可以使用 joins
和 references
。
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>
而且每次点击都会完美显示,非常简单和练习。谢谢各位帮帮我!