2016-07-16 51 views
1

我正在運行Ruby 2.1.9和Rails 3.2.17。Rails 3加入表和模型命名約定

首先,在Rails中,我總是假設模型幾乎總是單數。我已經看到了像product_categories_product這樣的模型名稱。這很好,而且在你希望模型與我看到instructions_products的關係一起工作的情況下。哪些在Rails sorta可能是有道理的,但我寧願命名模型instruction_product。這與名爲instructions_products的連接表關聯。

事實上,我很沮喪,我開始看軌道如何命名的事情,這發生了什麼?很明顯,它是模型的一個好名字,並且對應於正確的表名。但更有趣的是什麼?

ActiveModel::Naming.singular(InstructionsProducts) 

回報instructions_products

編輯:問題的心臟是爲什麼InstructionsProducts在軌有效的型號名稱和爲什麼上述解決我的例子爲單數,「instructions_products」。考慮到rails的慣例是保持模型名稱單數,這看起來很奇怪。

回答

1

你的問題對我來說還不完全清楚。

通過Rails的約定,模型名稱是單數,並用駱駝案例編寫,例如InstructionProduct。每個模型都使用相同的單詞匹配數據庫中的一個表格,以'_'和複數形式分隔。提供的示例爲instruction_products

看看使用has_many下面的例子:

class User < ActiveRecord::Base 
    has_many :contacts 
end 

class Contact < ActiveRecord::Base 
    belong_to :name 
end 

user = User.find(1) 
user.contacts # returns an array of all the associated objects 

在做user.contacts,接觸不是表名。它是收集方法,是has_many方法中傳遞的符號的佔位符(請遵循has_many鏈接並閱讀關於has_many的文檔說明)。不過,可以使用另一個名稱:

class User < ActiveRecord::Base 
    has_many :personal_contacts, class_name: 'Contact' #, foreign_key: :contact_id 
end 

user = User.find(1) 
user.personal_contacts 

class_name和foreign_key是必需的,因爲不遵循rails約定。當使用has_many :personal_contacts時,ra​​ils期望personal_contacts將返回一個PersonalContact的數組。

在Ruby中,您必須使用大寫字母開始類名稱,因此無法創建名爲instruction_product的類。如果你想提供一個不遵循Rails約定的名稱,我不建議,您將需要告知軌對新表名:

Class AdminUser 
    self.table_name = "users" 
end 

更新1:

正如你已經知道的那樣,約定規定模型應該被聲明爲單數(class InstructionProduct而不是class InstructionsProducts。但是它只是一個約定。當一個類繼承自ActiveRecord :: Base,並且生成了一個sql查詢時,ActiveRecord會降低類名,用_分隔單詞,將其轉換爲複數名稱並將其用作表名(主要用於導軌使用InstructionsProducts.model_name.plural wh ich返回instructions_products)。

你認爲單數實際上是單數名稱翻譯,即使它是複數形式,但它不是。它假定你正在使用約定,並且主要返回下劃線的類名稱。看看rails源代碼(ActiveModel::Name),ActiveSupport :: Inflector.underscore似乎被使用(我只是做了一個非常表面的調查,我不得不承認)。你可以看到underscore如何在文檔中工作。

+0

我知道類名必須大寫,而instruction_product不是有效的類名。爲什麼說明在rails中產生一個有效的模型名稱? –

+0

@AndrewStuntz我提供了更多的說明,請告訴我。 –

+0

我不是100%滿意的答案,但沒有一個答案。謝謝。我會自己做更多的研究。我認爲我的主要問題是我在看軌道如何處理表名稱的不正確的方法。如果我發現更有趣的話,我會更新。 –