проблема перегиба рельсов 3.1

У меня есть приложение 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

Модель соединения выглядит так

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_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, загружены те же файлы. Здесь происходит что-то странное!??


person David Tuite    schedule 06.07.2011    source источник
comment
Может глупый вопрос, но... если это доставляет вам столько хлопот - почему бы не найти для него другое имя? ;)   -  person Taryn East    schedule 09.07.2011
comment
Ха-ха, да, конечно, мы оба знаем, что я не могу позволить этому победить меня!   -  person David Tuite    schedule 09.07.2011
comment
Смотрите мое новое редактирование ниже. Похоже, перегибы здесь не помогут (по крайней мере, не так, как ожидалось) :-/   -  person Casper    schedule 10.07.2011


Ответы (1)


Вам нужно определить неправильный перегиб:

# 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!

Рубиновые документы:

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

person Casper    schedule 06.07.2011
comment
Привет, извините за отказ от моего согласия, я только частично протестировал ваше решение до сегодняшнего дня. Как ни странно, это работает в консоли, но не в тестах или когда я запускаю приложение. Я отредактировал свой ОП с учетом новой ситуации. - person David Tuite; 08.07.2011
comment
Привет.. нет проблем. Вполне вероятно, что spork не загружает файл перегибов. Запустите spork с spork -d, чтобы посмотреть, что он загружает, и/или добавьте файл перегибов в раздел предварительной загрузки spork в spec_helpers.rb. Также сделайте тестовый пример, который проверяет только перегиб. Похоже, вам нужен один для этого! :) - person Casper; 08.07.2011
comment
Про тесты очень верно! Я написал несколько и снова отредактировал ОП с тестами. Тесты проходят, но приложение все еще не работает из-за проблем с перегибом. - person David Tuite; 09.07.2011
comment
Извините, что так долго не принимал снова. Не хотел менять имена таблиц в середине при введении новых функций. Наконец-то он заработал с настройкой :class_name =>. Большое спасибо! - person David Tuite; 14.07.2011