Rails迁移 - 外键的替代名称?

时间:2011-09-01 17:38:58

标签: ruby-on-rails

在我的应用程序中,我有3个表,用户,列表,任务。

用户和列表是多对多关系,任务属于列表,用户可以完成任务。

对于我的迁移,当用户完成一个列表时,我想在数据库中存储它的完成者,但我不确定如何执行此操作。

我可以简单地将t.integer :user_id添加到我的任务迁移中,但我想将其称为.completed_by。在我的User表中引用:user_id但命名为:completed_by?

的东西

2 个答案:

答案 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"