2011-09-01 56 views
1

在我的应用程序中,我有3个表格,用户,列表,任务。Rails Migrations - 外键的替代名称?

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

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

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

回答

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

在您的迁移,添加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"