【问题标题】:With a model where the name is the same single as plural, `has_many, :through` isn't working in one direction对于名称与单复数相同的模型,`has_many, :through` 不能朝一个方向工作
【发布时间】:2013-08-01 12:43:30
【问题描述】:

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

例如,我有两个在控制台中正确播种(并且可以工作)的模型:CharacteristicsSpeciesCharacteristics 的设置方式如下:

class Characteristic < ActiveRecord::Base
    has_many :species_characteristics
    has_many :species, :through => :species_characteristics
    has_many :skills
end

Species 的设置方式如下:

class Species < ActiveRecord::Base
    has_many :species_characteristics
    has_many :characteristics, :through => :species_characteristics
end

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

如果我从控制台调用Characteristic.first.species,我会得到与该特征相关的物种列表。

但是,如果我调用 Species.first.characteristics,我会得到以下信息:

NameError: uninitialized constant Species::Characteristics

我正在考虑添加一个新的变形,或者以某种方式解决这个问题,但我什么也没想到。除了将模型重命名为 Race 之类的名称之外,还有没有更好的方法?


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

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-4 initialization inflection


【解决方案1】:

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

ActiveSupport::Inflector.inflections(:en) do |inflect|
    inflect.uncountable %w( species )
end

然后我检查并仔细检查了所有模型,以确保语法正确、关系合理且具有这种性质。原来,我使用的是has_many :species, :through =&gt; :species_characteristics,而应该是has_many :species, through: :species_characteristics。一旦我在物种和特征模型中解决了这些问题并在控制台中执行了reload!,一切都开始工作了。


特征模型:

class Characteristic < ActiveRecord::Base
    has_many :species_characteristics
    has_many :species, through: :species_characteristics
end

物种模型:

class Species < ActiveRecord::Base
    has_many :species_characteristics
    has_many :characteristics, through: :species_characteristics
end

物种特征模型:

class SpeciesCharacteristic < ActiveRecord::Base
    belongs_to :characteristic
    belongs_to :species
end

至此结束本期的恐怖统治。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多