0

Я следующие модели: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>' 

Почему?

ответ

1

Оно должно быть:

class Ingredient < ActiveRecord::Base 
# ... 
belongs_to :user, foreign_key: :created_by 
end 

class User < ActiveRecord::Base 

    has_many :ingredients, foreign_key: :created_by 
end 

Кроме того, удалить created_by из users таблицы и добавить к ingredients. Я предполагаю, что вы хотите связать Ingredient с User, который является разумным, так что Ingredient нуждается в created_by внешний ключ.

Обратите внимание, что я сбросил attr_accessible. Для Rails 4.0+ используются strong parameters (если вы не используете Rails < 4).

+0

Согласно руководству по рельсам http://guides.rubyonrails.org/association_basics.html, «foreign_key» должен быть объявлен в ассоциации belongs_to. Я попробовал то, что вы сказали, и когда я запрашиваю «u.ingredient», я получаю: ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: no такой столбец: components.user_id: – Lut

+0

Добавить 'foreign_key: 'created_by'' to' has_many: ингредиентов '' User'. Он ищет 'user_id' по умолчанию (название модели). Надеюсь, что 'created_by' теперь находится в таблице' components'. Если это так, все будет сделано. – blelump

+0

Готово! Я перемещал foreign_key: 'created_by' от одной модели к другой. Теперь я понимаю, что это должно быть на обоих. Благодаря! – Lut