Я обновляю приложение rails 2.3 до rails 3.0.3
На моей Product
модели
есть следующие расширения и области ассоциации
has_many :related_products, :through => :product_related_products do
[:alternative, :complement, :bigger_pack, :higher_quantity, :lower_quality].each do |meth|
define_method(meth) {
find :all, :conditions => ["product_related_products.#{meth} = ?", true] }
end
end
scope :visible, where(:hidden => false)
понятие взято из: http://guides.rubyonrails.org/association_basics.html#association-extensions
Когда я вызываю ассоциацию в цепочке
@product.related_products.visible.alternative
Отлично работает в rails 2.3, я получаю следующую ошибку в Rails 3:
undefined method `alternative' for #<ActiveRecord::Relation:0x1047ef978>
activerecord (3.0.3) lib/active_record/relation.rb:371:in `method_missing'
app/views/products/show.html.haml:18:in `_app_views_products_show_html_haml___1131941434_2185376080_0'
Я предполагаю, что это как-то связано с созданным новым отношением, но я не уверен, как поступить, руководство по рельсам все еще предлагает этот метод в порядке.
// редактировать после изменений, предложенных Франсуа:
Определения классов следующие:
class Product < ActiveRecord::Base
has_many :product_related_products
has_many :related_products, :through => :product_related_products
end
class ProductRelatedProduct < ActiveRecord::Base
belongs_to :product
belongs_to :related_product, :class_name => "Product"
scope :with_attribute, lambda {|attr| where(attr, true)}
end
@product.related_products.with_attribute(:alternative) raises:
NoMethodError Exception: undefined method `with_attribute' for #<Class:0x108fbd8b8>