rails 3.1变形问题

Dav*_*ite 3 ruby-on-rails inflection activesupport ruby-on-rails-3 ruby-on-rails-3.1

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

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
Run Code Online (Sandbox Code Playgroud)

Join模型看起来像这样

class ListingSave < ActiveRecord::Base
  belongs_to :team
  belongs_to :listing
end
Run Code Online (Sandbox Code Playgroud)

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 <top (required)>'
Run Code Online (Sandbox Code Playgroud)

仿佛Rails正在单个化listing_saveslisting_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
Run Code Online (Sandbox Code Playgroud)

我接下来该怎么办?

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

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

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'listing_save', 'listing_saves'
end
Run Code Online (Sandbox Code Playgroud)

当我打开一个控制台会话并运行时"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
Run Code Online (Sandbox Code Playgroud)

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

NameError:
       uninitialized constant User::ListingSafe
Run Code Online (Sandbox Code Playgroud)

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

Cas*_*per 11

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

# 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!
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

编辑:

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

has_many :listing_saves, :class_name => "ListingSave"
Run Code Online (Sandbox Code Playgroud)

其他人有同样的问题,并有额外的变形调整.我个人而言,我会:class_name改用这个设置:

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