在我的应用程序中,我有3个表,用户,列表,任务。
用户和列表是多对多关系,任务属于列表,用户可以完成任务。
对于我的迁移,当用户完成一个列表时,我想在数据库中存储它的完成者,但我不确定如何执行此操作。
我可以简单地将t.integer :user_id
添加到我的任务迁移中,但我想将其称为.completed_by
。在我的User表中引用:user_id但命名为:completed_by?
答案 0 :(得分:4)
正如MrDanA所提到的,你可以指定一个不同的foreign_key,但我建议不要这样做。如果可以的话,如果您继续使用实体名称约定,那么您的数据库结构将在较低级别更易理解。
将来,很明显user_id指向用户表,而新程序员将无法在不探索代码的情况下告知用户表中的completed_by点。如果您确实想要具有特定名称,或者需要多个用户关联,那么应用程序和数据库级别的“completed_user_id”之类的内容仍然清晰。
然后您可以添加以下方法:
has_one :user
has_one :completed_by, :class_name => "User", :foreign_key => "completed_user_id"
或
has_one :user
def completed_by
self.user.id
end
等
答案 1 :(得分:1)
在迁移中,添加t.integer :completed_by
然后,在您的模型中,而不是:
has_one :user
做的:
has_one :user, :class_name => "User", :foreign_key => "completed_by"
甚至可以自定义关联名称,例如:
has_one :completer, :class_name => "User", :foreign_key => "completed_by"