Миграция с Rails 2.3.11 на Rails 3.0.11: теперь невозможно использовать find с коллекцией записей AR - PullRequest
0 голосов
/ 07 января 2012

Я нахожусь в процессе перехода с Rails 2.3.11 на Rails 3.1.3, и сейчас я на Rails 3.0.11 и разбираюсь со всеми возникающими проблемами.

Первый, который яне могу решить: в Rails 2.3.11 я мог бы сделать следующее и получить необходимые записи обратно

@event_type_time_units = TimeUnit.find(@event.event_type.time_units)

В Rails 3.0.11 я пытался использовать

@event_type_time_units = TimeUnit.find_with_ids(@event.event_type.time_units)

и

@event_type_time_units = TimeUnit.find_some(@event.event_type.time_units)

Код для обоих из них не делает ничего волшебного, и я ожидал, что они не будут работать.

У кого-нибудь есть указатель для меня, пожалуйста.

Спасибо

edit: the error I get is TypeError in MeetingsController#create

Cannot visit TimeUnit

1 Ответ

1 голос
/ 07 января 2012

Rails 3 использует Arel или реляционную алгебру для извлечения ассоциаций. Предполагая, что ваша EventType модель связана с has_many :time_units, вы можете просто сделать следующее:

@event_type_time_units = @event.event_type.time_units

Кроме того, вы можете оптимизировать свои запросы, используя EventType в качестве модели объединения (ish):

# app/models/event.rb
belongs_to :event_type
has_many :time_units, :through => :event_type

# app/models/event_type.rb
has_many :events
has_many :time_units

Теперь вы можете делать запросы напрямую, сохраняя вызов SQL:

@event_time_units = @event.time_units

Короче говоря, нет причин делать поиск в ассоциации. Ассоциация возвращает «Массив» записей. (Я использую «Массив» в кавычках, потому что это не на самом деле массив, а ActiveRecord::Association, который ведет себя как массив)

Помимо

Я настоятельно рекомендую просто перейти на Rails 3.1.3. Переход с Rails 2 -> 3 так же сложно, как и 3 => 3.1. Избавь себя от головной боли. На самом деле, учитывая наследие вашего приложения, я рекомендую следующее:

  1. Создание нового пустого приложения Rails 3.1.3
  2. Скопируйте все ваши модели, представления, контроллеры и библиотеки в это новое приложение
  3. Поиск ваших существующих проектов для драгоценных камней -> добавить их в свой Gemfile
  4. Просмотрите все в config/*. Это где много изменений произошло. Если в вашем существующем приложении есть код для конкретного приложения, перенесите его на новое. В противном случае, оставьте это в покое.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...