Я следующие модели:Rails Пользовательского foreign_key дает NoMethodError
пользователя
class User < ActiveRecord::Base
...
attr_accessible :email
has_many :ingredients, class_name: "Ingredient", foreign_key: "created_by"
end
Ингредиент
class Ingredient < ActiveRecord::Base
...
attr_accessible :created_by
belongs_to :user
end
Я создал один ингредиент и имеет поле CREATED_BY заселен. Если я это сделаю:
> u = User.find(1)
> u.ingredients.size
=> 1
Так что отношения работают! Но если я делаю:
Ingrendient.last.created_by.email
Я получаю следующее сообщение об ошибке:
1.9.3-p362 :012 > Ingredient.last.created_by.email
Ingredient Load (0.3ms) SELECT "ingredients".* FROM "ingredients" ORDER BY "ingredients"."id" DESC LIMIT 1
NoMethodError: undefined method `email' for 1:Fixnum
from (irb):12
from /Users/andreucasadella/.rvm/gems/ruby-1.9.3-p362/gems/railties-3.2.11/lib/rails/commands/console.rb:47:in `start'
from /Users/andreucasadella/.rvm/gems/ruby-1.9.3-p362/gems/railties-3.2.11/lib/rails/commands/console.rb:8:in `start'
from /Users/andreucasadella/.rvm/gems/ruby-1.9.3-p362/gems/railties-3.2.11/lib/rails/commands.rb:41:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
Почему?
Согласно руководству по рельсам http://guides.rubyonrails.org/association_basics.html, «foreign_key» должен быть объявлен в ассоциации belongs_to. Я попробовал то, что вы сказали, и когда я запрашиваю «u.ingredient», я получаю: ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: no такой столбец: components.user_id: – Lut
Добавить 'foreign_key: 'created_by'' to' has_many: ингредиентов '' User'. Он ищет 'user_id' по умолчанию (название модели). Надеюсь, что 'created_by' теперь находится в таблице' components'. Если это так, все будет сделано. – blelump
Готово! Я перемещал foreign_key: 'created_by' от одной модели к другой. Теперь я понимаю, что это должно быть на обоих. Благодаря! – Lut