我已经写了一个范围来过滤结果,其中“免费入场=真”'。我希望范围适用于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'
如何将范围细化为父类的子级。
由于
答案 0 :(得分:3)
您的错误是因为您使用Object.property
作为哈希中的键,这是无效的语法。您需要做的是告诉它加入Products表,然后您可以使用merge
重新使用产品的范围。
试试这个:
class JobProduct
...
scope :not_free, -> { joins(:product).merge(Product.not_free_entry_scope) }
...
end