0

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

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
4

2 回答 2

1

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

假设User模型的主键被称为id,您应该将 user_id 字段更改为Muser,并更改belongs_to :user, :foreign_key => "smail"为:

belongs_to :user

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

has_one :muser

此外,要遵循 rails 模型命名约定,您应该重命名UsersUser和。MusersMuser

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

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

有关选择主键的更多信息:如何选择我的主键?

于 2013-07-19T15:07:36.103 回答
1

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

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

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

于 2013-07-19T15:07:49.013 回答