rails 3.1变形问题

我有一个Rails 3.1应用程序与以下2个型号

class Listing < ActiveRecord::Base has_many :listing_saves end class Team < ActiveRecord::Base has_many :listing_saves has_many :saved_listings, through: :listing_saves, source: 'listing' end 

Join模型看起来像这样

 class ListingSave < ActiveRecord::Base belongs_to :team belongs_to :listing end 

Mow我认为存在变形问题,因为每当我尝试运行测试时,我都会收到以下错误(这是一个错误示例和导致它的测试)

 it "should return the listing saves associated with the team" do save = Factory :listing_save, listing: @listing, saver: @user, team: @team @team.listing_saves.should include save end Failures: 1) Team listing_saves associations should return the listing saves associated with the team Failure/Error: @team.listing_saves.should include save NameError: uninitialized constant Team::ListingSafe # ./spec/models/team_spec.rb:55:in `block (3 levels) in ' 

好像Rails将listing_saves单独化为listing_safe

以下是我尝试过的一些自定义变形金刚(不是所有的同时)(它们都不起作用)

 # config/initializers/inflections.rb ActiveSupport::Inflector.inflections do |inflect| inflect.plural 'saved_listing', 'saved_listings' inflect.singular 'saved_listings', 'saved_listing' inflect.plural 'listing_save', 'listing_saves' inflect.singular 'listing_saves', 'listing_save' inflect.singular 'listing_safes', 'listing_safe' inflect.plural 'listing_safe', 'listing_safes' inflect.irregular 'listing_save', 'listing_saves' inflect.irregular 'saved_listing', 'saved_listings' end 

我接下来该怎么办?

注意:我发现了这个类似的问题,但答案似乎并没有解决我的问题

编辑我按照下面的答案,以便我现在在我的config/initializers/inflections.rb有以下内容

 ActiveSupport::Inflector.inflections do |inflect| inflect.irregular 'listing_save', 'listing_saves' end 

当我打开一个控制台会话并运行"listing saves".singularize 。我正在希望得到“listing_save”。 但是,似乎我的应用程序的至少一部分没有得到它,我的测试仍然以与以前相同的方式失败。 (我发誓,在我测试/运行应用程序之前,我正在重新启动我的服务器和spork!)。

编辑2我在我的应用程序中为变形编写了一些测试:

 describe "inflection" do it "should singularize listing_saves properly" do "listing_saves".singularize.should == "listing_save" end it "should pluralize listing_save properly" do "listing_save".pluralize.should == "listing_saves" end end 

现在我有一种情况,这些测试通过正常,但其他测试仍然失败,我遇到了同样的错误

 NameError: uninitialized constant User::ListingSafe 

相同的应用程序,相同的spork实例,加载相同的文件。 奇怪的事发生在这里!??

你需要定义一个不规则的变形:

 # Test your inflections! > "listing_save".pluralize => "listing_saves" # OK! > "listing_saves".singularize => "listing_safe" # Ouch :( # Make it smarter ActiveSupport::Inflector.inflections { |i| i.irregular 'listing_save', 'listing_saves' } # Test again > "listing_saves".singularize => "listing_save" # Yay! 

Ruby文档:

 ------------------------ ActiveSupport::Inflector::Inflections#irregular irregular(singular, plural) ------------------------------------------------------------------------ Specifies a new irregular that applies to both pluralization and singularization at the same time. This can only be used for strings, not regular expressions. You simply pass the irregular in singular and plural form. Examples: irregular 'octopus', 'octopi' irregular 'person', 'people' 

编辑:

一些进一步的调查 – 看起来其他人也偶然发现了同样的问题(变形没有与协会的预期一致)。 因此,在此期间您可以手动设置类名:

 has_many :listing_saves, :class_name => "ListingSave" 

其他人有同样的问题,并有额外的变形调整。 我个人也会使用:class_name设置:

Ruby on Rails 3.0.3中的自定义变形问题