【问题标题】:Rails belongs_to returns nil classRails belongs_to 返回 nil 类
【发布时间】:2013-07-20 05:08:16
【问题描述】:

我正在尝试将两个表相互链接

class Musers < ActiveRecord::Base
    # Email 
    # sid (student_id:integer)
    # isyk: boolean

    belongs_to :user, :foreign_key => "smail"
end

class Users < ActiveRecord::Base

    belongs_to :muser, :foreign_key => "email"

end

但是,

@user = Users.first
@user.muser returns nil

【问题讨论】:

  • 所提供的答案解释了核心问题,但是您生成@user 的方式也存在问题。你不应该复数模型名称。相反,请使用@user = User.first
  • @JamesChevalier user = Users.first 创建用户而不是 User.first,它表示未初始化的常量
  • @Yagiz 您应该将 Users 重命名为 User 并将 Musers 重命名为 Muser。 Rails 模型应以其单数形式命名。

标签: ruby-on-rails


【解决方案1】:

通过说:foreign_key =&gt; "smail",您是在告诉rails Musersmail 指向User 模型的外键。很可能不是这种情况。

假设User模型的主键叫id,你应该把user_id字段改成Muser,把belongs_to :user, :foreign_key =&gt; "smail"改成:

belongs_to :user

User 模型上,您可以使用以下方法定义反向关系:

has_one :muser

此外,要遵循 Rails 模型命名约定,您应该将 Users 重命名为 User 并将 Musers 重命名为 Muser

您应该阅读有关belongs_tohas_one 的更多信息。

另一方面,如果User 模型实际上使用电子邮件作为它的主键,我强烈建议您更改它并添加一个自动递增的主键。根据经验,应该选择主键,使其永远不会改变。如果它确实改变了,所有指向该主键的外键也必须改变。 如果您有特定的原因,您应该只使用非自动递增的主键。

更多关于选择主键的信息:How to choose my primary key?

【讨论】:

    【解决方案2】:

    你不能只告诉 Rails 关联的类型,你实际上必须将关联设置为该类的实例。例如,创建一个新的muser 不会自动将用户分配为belongs_to。你可以做类似的事情

    u = User.new
    u.muser = Muser.first
    u.save
    

    但是,我不确定您想通过 belongs_to - belongs_to 关系来完成什么,但您应该知道您要做的不仅仅是告诉 rails 它存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多