我正在运行Ruby 2.1.9和Rails 3.2.17。
首先,在Rails中,我总是假设模型几乎总是单数。我见过像product_categories_product这样的模型名称。这很好,在habtm情况下,你希望模型与我看过instructions_products的关系一起工作。在Rails sorta中哪些可能有意义,但我宁愿将模型命名为instruction_product。这与名为instructions_products的联接表相关联。
事实上,我很沮丧,我开始研究rails如何命名事情,这发生了什么?很明显它是模型的正确名称,并且对应于正确的表名。但是什么更适合?
ActiveModel::Naming.singular(InstructionsProducts)
返回instructions_products
编辑:问题的核心是为什么说明产品在rails中是有效的模型名称,为什么我的上面示例解析为单数' instructions_products'。考虑到rails约定是保持模型名称是单数的,这看起来很奇怪。
答案 0 :(得分: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
时,联系人不是表名。它是collection方法,是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约定的名称(我不建议这样做),您需要告知rails有关新表名的信息:
Class AdminUser
self.table_name = "users"
end
更新1:
正如您所知,该约定规定模型应声明为单数(class InstructionProduct
而不是class InstructionsProducts
。但它只是一个约定。当一个类继承自ActiveRecord :: Base,并且生成sql查询,ActiveRecord小写类名,用_分隔单词,转换为复数名称并将其用作表名(主要是rails使用InstructionsProducts.model_name.plural
返回instructions_products
)。
你假设单数实际上是对单数进行名称翻译,即使它是用复数形式写的,但事实并非如此。它假定您正在使用约定,并且主要返回下划线的类名。
查看rails源代码(ActiveModel::Name),似乎使用了ActiveSupport :: Inflector.underscore(我只是做了一个非常肤浅的调查,我不得不承认)。您可以看到underscore在文档中的工作原理。