基于父模型布尔值过滤子模型

时间:2014-07-17 15:29:48

标签: ruby-on-rails ruby

我已经写了一个范围来过滤结果,其中“免费入场=真”'。我希望范围适用于Products数据库及其子job_product。

Product.rb

#  id               :integer          not null, primary key
#  title            :string(255)
  ............
#  free_entry       :boolean          default(FALSE)

class Product < ActiveRecord::Base

  scope :not_free_entry_scope, -> { where(free_entry: false) }
  has_many :job_products, dependent: :destroy,
                     inverse_of: :product

job_product.rb

# Table name: job_products
#
#  id           :integer          not null, primary key
#  job_id       :integer
#  product_id   :integer
#  quantity     :integer          default(1)
#  frozen_cache :text
#  created_at   :datetime
#  updated_at   :datetime
#

class JobProduct < ActiveRecord::Base

  # associations
  belongs_to :product, inverse_of: :job_products
  scope :not_free_entry_scope, -> { where(free_entry: false) }

我知道它有效,我可以将它放在rails控制台中,如此,

Product.where("free_entry = true")

我可以成功调整产品模型的范围,但是当我尝试将相同的范围应用于job_product模型,并在控制器中使用它时会发出错误

Unknown column 'job_products.free_entry' in 'where clause'

如何将范围细化为父类的子级。

由于

1 个答案:

答案 0 :(得分:3)

您的错误是因为您使用Object.property作为哈希中的键,这是无效的语法。您需要做的是告诉它加入Products表,然后您可以使用merge重新使用产品的范围。

试试这个:

class JobProduct
  ...
  scope :not_free, -> { joins(:product).merge(Product.not_free_entry_scope) }
  ...
end