2011-02-17 51 views
3

如何在外部鏈接中給外鍵命名?如何在RoR 3中給外鍵一個名字?

我用下面的命令給外鍵:

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 

現在,當我從項目准入USER_ID像 project.owner.userid它拋出異常。

+1

是否有你想要做什麼特別的原因? Rails使用該命名約定來啓用ActiveRecord來構建關聯,而不必顯式配置表和外鍵名稱。使用不同的約定是一個**不好的想法,只會導致問題。 – 2011-02-17 04:52:15

+0

然後在這裏使用什麼命名約定? – 2011-02-17 05:02:18

回答

7

基於在評論你的反應,這是實現你想要做什麼的一種方式:

假設兩款車型在您的應用程序(用戶和問題),以及兩種不同的關係:

  • 用戶問了很多問題,問題belongs_to的提問者
  • 用戶編輯了很多問題,問題belongs_to的編輯

您可以實現這種結構通過以下方式:

rails generate scaffold Question asker_id:integer editor_id:integer 

指定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] 

希望這有助於。

0

添加到@ Dan的答案,傳遞類名稱作爲字符串。

拒絕警告:將一個類傳遞給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