对于名称与复数相同的模型,`has_many,:through`不在一个方向上工作

Ser*_*ean 5 ruby initialization ruby-on-rails inflection ruby-on-rails-4

我正在构建一个应用程序来为星球大战RPG生成角色.我添加了Species模型.Species是复数的单数,这是一个循环.我可以通过使用在应用程序中使路由正常工作species_index_path,但由于某种原因,has_many :characteristics, :through => :species_characteristics它不是在一个方向上工作.

例如,我有两个模型在控制台中正确播种(和工作):CharacteristicsSpecies.Characteristics按以下方式设置:

class Characteristic < ActiveRecord::Base
    has_many :species_characteristics
    has_many :species, :through => :species_characteristics
    has_many :skills
end
Run Code Online (Sandbox Code Playgroud)

Species 按以下方式设置:

class Species < ActiveRecord::Base
    has_many :species_characteristics
    has_many :characteristics, :through => :species_characteristics
end
Run Code Online (Sandbox Code Playgroud)

他们之间的模型只有一个belongs_to.

如果我Characteristic.first.species从控制台打电话,我会得到与该特征相关的物种清单.

Species.first.characteristics但是,如果我打电话,我会得到以下信息:

NameError: uninitialized constant Species::Characteristics
Run Code Online (Sandbox Code Playgroud)

我期待增加一个新的变形,或者某种方式,但我什么都没有.有没有人有更好的方法将模型重命名为Race?


TLDR:has_many由于未初始化的常量错误,关系不能仅在一个方向上起作用,可能是由于拐点问题.除了重命名模型之外,还有什么方法可以修复它吗?

Ser*_*ean 3

经过几个小时的修改,我解决了这个问题。我删除了对 inflections.rb 文件所做的任何额外更改,因此它看起来像这样:

ActiveSupport::Inflector.inflections(:en) do |inflect|
    inflect.uncountable %w( species )
end
Run Code Online (Sandbox Code Playgroud)

然后我仔细检查了所有模型,以确保语法正确、关系有意义以及具有这种性质。事实证明,我has_many :species, :through => :species_characteristics在应该使用的时候使用了has_many :species, through: :species_characteristics。一旦我修复了物种和特征模型中的这些问题并reload!在控制台中完成,一切就开始工作了。


特性型号:

class Characteristic < ActiveRecord::Base
    has_many :species_characteristics
    has_many :species, through: :species_characteristics
end
Run Code Online (Sandbox Code Playgroud)

品种型号:

class Species < ActiveRecord::Base
    has_many :species_characteristics
    has_many :characteristics, through: :species_characteristics
end
Run Code Online (Sandbox Code Playgroud)

物种特征模型:

class SpeciesCharacteristic < ActiveRecord::Base
    belongs_to :characteristic
    belongs_to :species
end
Run Code Online (Sandbox Code Playgroud)

至此,这个问题的恐怖统治结束了。