【问题标题】:Rails 4.1.x HABTM Undefined Method 'foreign_key'Rails 4.1.x HABTM 未定义方法'foreign_key'
【发布时间】:2014-07-07 18:48:11
【问题描述】:

以下定义适用于 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>'

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4.1


    【解决方案1】:

    在 Rails 4.1 中搜索任何记录在案的 HABTM 更改后,我找不到任何东西。 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
    

    此更改不会影响任何其他关联。但确保从现在开始始终使用字符串可能是件好事。

    【讨论】:

    • 谢谢,这为我省了很多麻烦
    • 另外我想指出,使用class: Gemgento::Storeclass_name: Gemgento::Store.name 可以避免输入错误
    猜你喜欢
    • 1970-01-01
    • 2014-08-26
    • 2015-03-06
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多