Rails 4.1.x HABTM Неопределенный метод «внешний_ключ»

Следующее определение работало в Rails 4.0.x и ниже:

module Gemgento
   class Product < ActiveRecord::Base
      has_and_belongs_to_many :stores, -> { distinct }, join_table: 'gemgento_stores_products', class_name: Gemgento::Store
   end
end

Однако после обновления до Rails 4.1.x я начал получать следующую ошибку всякий раз, когда инициализировался класс Gemgento::Product.

NoMethodError: undefined method `foreign_key' for #<Class:0x007f870f18e668>
from /Users/Kevin/.rvm/gems/ruby-1.9.3-p429@sellect/gems/activerecord-4.1.4/lib/active_record/dynamic_matchers.rb:26:in `method_missing'
from /Users/Kevin/.rvm/gems/ruby-1.9.3-p429@sellect/gems/activerecord-4.1.4/lib/active_record/associations/builder/has_and_belongs_to_many.rb:113:in `belongs_to_options'
from /Users/Kevin/.rvm/gems/ruby-1.9.3-p429@sellect/gems/activerecord-4.1.4/lib/active_record/associations/builder/has_and_belongs_to_many.rb:82:in `through_model'
from /Users/Kevin/.rvm/gems/ruby-1.9.3-p429@sellect/gems/activerecord-4.1.4/lib/active_record/associations.rb:1580:in `has_and_belongs_to_many'
from /Users/Kevin/Sites/gemgento/app/models/gemgento/product.rb:21:in `<class:Product>'

person KPheasey    schedule 07.07.2014    source источник


Ответы (1)


После поиска каких-либо задокументированных изменений в HABTM в Rails 4.1 я ничего не смог найти. В версии 4.0 также не было предупреждений об устаревании. Оказывается, :class_name должен быть определен как String.

module Gemgento
   class Product < ActiveRecord::Base
      has_and_belongs_to_many :stores, -> { distinct }, join_table: 'gemgento_stores_products', class_name: 'Gemgento::Store'
   end
end

Это изменение не влияет на другие ассоциации. Но, вероятно, хорошо убедиться, что с этого момента строка всегда используется.

person KPheasey    schedule 07.07.2014
comment
Спасибо, это избавило меня от многих проблем - person Rahul Sekhar; 09.07.2014
comment
Также я хотел бы отметить, что полезно использовать либо class: Gemgento::Store, либо class_name: Gemgento::Store.name, чтобы уберечь себя от опечаток. - person faron; 16.08.2015