我遇到了rails复数的问题。
我有一个名为CompanySkill
的模型(代表一家公司拥有的技能)。当创建模型rails时,它使用companies_skill
而不是company_skills
进行复数,因此当我需要设置has_many :company_skills
关联rails时不使用该模型。
这个问题的正确解决方案是什么?我想的是使用屈折,但我不知道这是否是正确的解决方案和/或有更好的解决方案。
我从控制台生成模型:
rails generate model CompanySkill
invoke active_record
create db/migrate/20160511111048_create_companies_skill.rb
create app/models/company_skill.rb
invoke test_unit
create test/models/company_skill_test.rb
create test/fixtures/companies_skill.yml
您有两个选项。
首先,您可以覆盖此名称的屈折符。在config/initializers/inflections.rb
中添加以下内容:
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.irregular 'company_skill', 'company_skills'
end
或者,也可能是最好的解决方案,您可以在关联上指定类名。在你的模型中使用这样的东西:
has_many :company_skills, class_name: 'CompanySkill'
尽管,正如其他人所说,这两种解决方案都不应该是必需的,因为默认情况下,Rails应该将company_skill
多元化为company_skills
。
好的,我想我解决了这个问题。
我首先用生成了模型
rails generate model CompanySkill
这使得模型被错误地复数化。
invoke active_record
create db/migrate/20160511111214_create_companies_skill.rb
create app/models/company_skill.rb
invoke test_unit
create test/models/company_skill_test.rb
create test/fixtures/companies_skill.yml
然后我编辑了迁移,更改了表名:
class CreateCompaniesSkill < ActiveRecord::Migration
def change
create_table :company_skills do |t| #was :companies_skill
t.integer :skill_id
t.integer :company_id
t.integer :level
t.timestamps null: false
end
end
end
然后我终于按照建议在模型中使用了self.table_name:
class CompanySkill < ActiveRecord::Base
self.table_name = "company_skills"
belongs_to :company, inverse_of: :company_skills
belongs_to :skill
validates_presence_of :company
validates_presence_of :skill
end
所以现在,如果我从控制台创建一个company_skill,然后我做company.first.skills,我可以获得技能
Company.first.skills
Company Load (0.1ms) SELECT "companies".* FROM "companies" ORDER BY "companies"."id" ASC LIMIT 1
Skill Load (0.4ms) SELECT "skills".* FROM "skills" INNER JOIN "company_skills" ON "skills"."id" = "company_skills"."skill_id" WHERE "company_skills"."company_id" = ? [["company_id", 1]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Skill id: 1, name: "Nihil dolorum maiores et ex temporibus est. Volupt...", school_year: 2, created_at: "02/05/2016 20:09:54", updated_at: "02/05/2016 20:09:54">]>
但是,如果我删除self.table_name,我会得到错误ActiveRecord::StatementInvalid: Could not find table 'companies_skill'
我这样做对吗?