创建模型时轨道复数错误



我遇到了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'

我这样做对吗?

最新更新