2014-07-07 15 views
8

Các định nghĩa sau đây được làm việc trong Rails 4.0.x và dưới:Rails 4.1.x HABTM Không xác định Phương pháp 'foreign_key'

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

Tuy nhiên, sau khi nâng cấp lên Rails 4.1.x, tôi bắt đầu nhận được lỗi sau bất cứ khi nào lớp Gemgento::Product được khởi tạo.

NoMethodError: undefined method `foreign_key' for #<Class:0x007f870f18e668> 
from /Users/Kevin/.rvm/gems/[email protected]/gems/activerecord-4.1.4/lib/active_record/dynamic_matchers.rb:26:in `method_missing' 
from /Users/Kevin/.rvm/gems/[email protected]/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/[email protected]/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/[email protected]/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>' 

Trả lời

18

Sau khi tìm kiếm bất kỳ thay đổi nào được ghi thành HABTM trong Rails 4.1, tôi không thể tìm thấy bất kỳ điều gì. Không có cảnh báo không dùng nữa trong 4.0. Nó chỉ ra rằng :class_name phải được định nghĩa là một 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 

Thay đổi này không ảnh hưởng đến bất kỳ liên kết nào khác. Nhưng nó có lẽ là tốt để đảm bảo một chuỗi luôn luôn được sử dụng từ bây giờ.

+1

Cảm ơn, điều này đã giúp tôi giải quyết rất nhiều rắc rối –

+1

Ngoài ra, tôi muốn lưu ý rằng việc sử dụng cả hai loại: 'class: Gemgento :: Store' hoặc' class_name: Gemgento :: Store.name' để tiết kiệm cho mình khỏi các loại mistypes – faron

Các vấn đề liên quan