Rails 4范围通过belongs_to关联

时间:2016-02-01 19:11:45

标签: ruby-on-rails ruby-on-rails-4 scope rails-activerecord acts-as-shopping-cart

我正在尝试根据其中一个父列中的值来查看子记录数组。我试图找到所有属于具有类别" Bundle的产品的ShoppingCartItem。"

我正在尝试使用acts_as_shopping_cart_gem

我的模特。

User.rb

class User < ActiveRecord::Base
  has_many :shopping_carts, dependent: :destroy
end

ShoppingCart.rb

class ShoppingCart < ActiveRecord::Base
  acts_as_shopping_cart_using :shopping_cart_item
  belongs_to :user
  has_many :shopping_cart_items, dependent: :destroy
  has_many :products, through: :shopping_cart_items
end

Product.rb

class Product < ActiveRecord::Base
  has_many :shopping_cart_items,  dependent: :destroy
end

ShoppingCartItem.rb

class ShoppingCartItem < ActiveRecord::Base
  belongs_to :product,  dependent: :destroy

  scope :bundles,  ->  { 
    joins(:product).where('products.category = ?', 'Bundles') unless category.blank?
  }

end

我收到此错误:

> undefined local variable or method `category' for
> #<Class:0x007fc0f40310d0>

3 个答案:

答案 0 :(得分:1)

您的问题实际上是直截了当的 - 您无法定义category变量。

我就是这样做的(广义范围):

scope :by_category, lambda { |category|
  joins(:product).where(products: { category: category })
}

注意,没有unless语句 - 如果类别未传递给范围,则会引发ArgumentError。

然后将范围用于任何类别:

ShoppingCartItem.by_category('Bundles')

要防止将空白类别传递到范围,请确保传递正确的字符串。您可以创建类别下拉列表:

Product.pluck(:category)

或类似的东西,如果它是用户界面的一部分。

答案 1 :(得分:0)

范围内的类别字段是否与ShoppingCartItem相关?如果是,请尝试self.category.blank?。如果没有,只需删除unless语句。

答案 2 :(得分:0)

也许您需要添加Category模型并添加此关系:

class Product < ActiveRecord::Base
  has_many :shopping_cart_items,  dependent: :destroy
  belongs_to :category
end