你的问题对我来说并不完全清楚。
根据 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时,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 约定的名称,我不建议这样做,你需要通知 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 的工作原理。