如何在RoR中为外键指定名称?
我使用以下命令给出外键:
rails generate scaffold Table2 id:integer Table1:references
此命令adds foreign key of Table1 in Table2
,但默认名称为Table1_id
。那么我如何为其提供自定义名称,例如my_table_f_key
而不是Table1_id
。
我正在使用Ruby 1.9.2和Rails 3.0.3。
修改: - 的
在我的project.rb
模型中:
belongs_to :own, :class_name => User
在我的user.rb
模型中:
has_many :owned_projects, :class_name => Project, :foreign_key => :owner
我是如何创建项目模型的
rails generate scaffold Project name:string owner:integer
现在当我从Project访问user_id时
project.owner.userid
它会引发异常。
答案 0 :(得分:7)
根据您在评论中的回答,这是实现您想要做的事情的一种方式:
假设您的应用中有两个模型(用户和问题),以及两种不同的关系:
您可以通过以下方式实现此结构:
rails generate scaffold Question asker_id:integer editor_id:integer
在generate命令中指定id:integer
是多余的,因为Rails会自动为您生成该列。根据关系命名外键也是常规的(即asker_id
)。
然后,在每个模型中:
class Question < ActiveRecord::Base
belongs_to :asker, :class_name => User
belongs_to :editor, :class_name => User
end
class User < ActiveRecord::Base
has_many :asked_questions, :class_name => Question, :foreign_key => :asker_id
has_many :edited_questions, :class_name => Question, :foreign_key => :editor_id
end
这样,你可以像这样使用它们:
@question.asker # => User
@question.editor # => User
@user.asked_questions # => [Question, Question, Question]
@user.edited_questions # => [Question, Question]
希望这有帮助。
答案 1 :(得分:0)
添加到@ Dan的答案,将类名称传递给String。
DEPRECATION警告:不推荐将类传递给
class_name
,并且会在Rails 5.2中引发ArgumentError。它会加载更多不必要的类,并可能创建循环依赖项。请将类名作为字符串传递
class Question < ActiveRecord::Base
belongs_to :asker, :class_name => User
belongs_to :editor, :class_name => User
end
class User < ActiveRecord::Base
has_many :asked_questions, :class_name => 'Question', :foreign_key => :asker_id
has_many :edited_questions, :class_name => 'Question', :foreign_key => :editor_id
end