我正在尝试将两个表相互链接
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
答案 0 :(得分:1)
通过说:foreign_key => "smail"
,您告诉我Muser
列smail
指向User
模型的外键。很可能不是这种情况。
假设User
模型的主键名为id
,则应将user_id字段设为Muser
,并将belongs_to :user, :foreign_key => "smail"
更改为:
belongs_to :user
在User
模型上,您可以使用以下方法定义反向关系:
has_one :muser
此外,要遵循rails模型命名约定,您应将Users
重命名为User
,将Musers
重命名为Muser
。
您应该详细了解belongs_to和has_one。
另一方面,如果User
模型实际上使用电子邮件作为主键,我强烈建议您更改它并添加自动递增主键。根据经验,应选择主键,使其永不改变。如果确实发生了变化,那么指向该主键的所有外键也必须改变。
如果您有特定原因,则应仅使用非自动递增主键。
有关选择主键的更多信息:How to choose my primary key?
答案 1 :(得分:1)
嗯,你不能告诉rails关联的类型,你实际上必须将关联设置为该类的实例。例如,制作新的muser不会自动将用户指定为belongs_to
。你可以做点什么
u = User.new
u.muser = Muser.first
u.save
但是,我不确定你想用belongs_to - belongs_to关系完成什么,但是你应该知道你必须做的不仅仅是告诉它存在。