Как избавиться от этой конфликтной ситуации в моем приложении Rails 3?

В разделе config/initializers/ у меня есть один файл ruby, который будет загружать идентификатор моего экземпляра по умолчанию "car" из базы данных. Итак, после запуска моего приложения мое приложение может напрямую использовать этот идентификатор автомобиля по умолчанию.

НО, мне нужно сначала вставить этот автомобиль по умолчанию в базу данных, поэтому мне нужна задача rake (seed) или, в качестве альтернативы, база данных < strong>миграция для сохранения автомобиля по умолчанию в таблицу Cars базы данных.

А вот и КОНФЛИКТ! Если я запускаю задачу rake или миграцию для вставки экземпляра в базу данных, файлы инициализатора всегда будут запускаться СНАЧАЛА до того, как что-либо запустится, что означает, что файл ruby ​​в разделе "config /initializers/" получит нулевой идентификатор автомобиля по умолчанию, потому что автомобиль по умолчанию ЕЩЕ НЕ сохранен в базе данных.

Итак, как избавиться от этого конфликта? (Цель этого файла инициализатора - загрузить идентификатор автомобиля по умолчанию только ОДИН РАЗ) Есть ли другой способ загрузить идентификатор автомобиля по умолчанию только один раз?

------------- Редактировать----------

код под инициализаторами:

default_car=Car.where({:name => DEFAULT_CAR_NAME})
def default_car_id
  return {:default_car_id=>default_car.id}
end

person Mellon    schedule 31.03.2011    source источник
comment
Можете ли вы вставить код, который вы используете внутри инициализатора, пожалуйста?   -  person Ant    schedule 31.03.2011
comment
Я добавил свой код инициализатора, проверьте мой обновленный пост.   -  person Mellon    schedule 31.03.2011
comment
Вы можете создать автомобиль в инициализаторе вместо того, чтобы делать это, но это выглядит немного запутанно. Когда и как вы вызываете default_car_id?   -  person Ant    schedule 31.03.2011
comment
В настоящее время я буду использовать default_car_id в своих методах в модели автомобиля, поскольку он также будет использоваться во всех других моделях, поэтому я собираюсь загрузить его только один раз...   -  person Mellon    schedule 31.03.2011


Ответы (1)


Я бы так не делал - выглядит довольно грязно. Один запрос к базе данных не очень дорог, поэтому я бы сделал что-то вроде этого в вашей модели автомобиля:

class Car < ActiveRecord::Base

  def self.default_car
    @default_car ||= Car.where(:name => DEFAULT_CAR_NAME)
    @default_car
  end

end

Вероятно, было бы неплохо поместить DEFAULT_CAR_NAME в файл конфигурации yaml, если он вообще будет изменен, иначе я бы просто жестко закодировал его.

person Ant    schedule 31.03.2011