你的問題對我來說還不完全清楚。
通過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
時,rails期望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如何在文檔中工作。
我知道類名必須大寫,而instruction_product不是有效的類名。爲什麼說明在rails中產生一個有效的模型名稱? –
@AndrewStuntz我提供了更多的說明,請告訴我。 –
我不是100%滿意的答案,但沒有一個答案。謝謝。我會自己做更多的研究。我認爲我的主要問題是我在看軌道如何處理表名稱的不正確的方法。如果我發現更有趣的話,我會更新。 –