【问题标题】:Rails Custom foreign_key gives NoMethodErrorRails Custom foreign_key 给出 NoMethodError
【发布时间】:2014-11-08 21:02:40
【问题描述】:

我有以下型号:

用户

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>'

为什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 foreign-keys associations


    【解决方案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
    

    另外,从users 表中删除created_by 并添加到ingredients。我假设您想将IngredientUser 关联,这是合理的,因此Ingredient 需要created_by 外键。

    请注意,我已删除 attr_accessible。对于 Rails 4.0+,使用 strong parameters(除非您使用的是 Rails

    【讨论】:

    • 根据 rails guide guides.rubyonrails.org/association_basics.html,应该在 belongs_to 关联上声明“foreign_key”。我试过你说的,当我查询“u.ingredient”时,我得到:ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: ingredients.user_id:
    • foreign_key: 'created_by' 添加到has_many :ingredientsUser 模型。默认情况下它正在寻找user_id(型号名称)。我希望created_by 现在在ingredients 表中。如果是这样,它就完成了。
    • 完成!我正在将 foreign_key: 'created_by' 从一个模型移动到另一个模型。现在我明白它必须同时存在。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2013-04-25
    相关资源
    最近更新 更多