3

我有以下2種型號軌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 

的加入模型的Rails 3.1的應用程序看起來像這樣

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

慕我認爲有一個拐點的問題,因爲每當我嘗試運行我的測試我得到以下錯誤(這是錯誤的示例和導致它的測試)

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)>' 

彷彿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 

我能做些什麼未來?

注:我發現this similar question但答案似乎並沒有解決我的問題

編輯 我也跟着下面的答案,讓我現在已經在我的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實例,加載相同的文件。這裏有一些奇怪的事情發生!

+0

見下面我的新評論。 – Casper

+0

也許是個愚蠢的問題,但是......如果它給你帶來這麼多麻煩 - 爲什麼不找個別的名字呢? ;) –

+0

哈哈當然是啊,我們都知道我不能讓它擊敗我! –

回答

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! 

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去,而不是設置雖然:

Issue with custom inflections in Ruby on Rails 3.0.3

+0

很好的答案,謝謝! –

+0

嗨,對於收回我的接受感到抱歉,我只部分測試了您的解決方案,直到今天。奇怪的是,它在控制檯中工作,但在測試中或運行應用程序時不起作用。我用新的情況編輯了我的OP。 –

+0

嗨..沒問題。這很可能是spork沒有加載變形文件。用'spork -d'運行spork以查看它加載的內容,和/或將變換文件添加到'spec_helpers.rb'中的spork預加載部分。也做一個測試案例,測試變化。它看起來像你需要一個! :) – Casper