Обновление до Rails 3, расширения ассоциации has_many больше не работают с областями действия - PullRequest
2 голосов
/ 26 ноября 2010

Я обновляю приложение 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>

1 Ответ

0 голосов
/ 26 ноября 2010

Определите свои области в соответствующем классе:

class RelatedProduct < ActiveRecord::Base

  scope :visible, where(:hidden, false)

  %w(alternative complement bigger_pack higher_quantity lower_quality).each do |attribute|
    scope attribute, where(attribute, true)
  end

end

@product.related_products.visible.bigger_pack

Либо создайте единственный метод, который ожидает искомый атрибут:

class RelatedProduct < ActiveRecord::Base
  scope :with_attribute, lambda {|attr| where(attr, true)}
end

@product.related_products.visible.with_attribute(:bigger_pack)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...