Только один экземпляр модели в Rails - PullRequest
3 голосов
/ 28 августа 2009

Я работаю над своим первым приложением Rails. Необходимо хранить некоторую информацию об одном рекламном объявлении, которое будет отображаться на каждой странице. Администратор просто должен иметь возможность установить URL, заголовок и изображение. Очевидно, мне нужен только один экземпляр этого рекламного объекта.

Я создал модель, которая наследуется от ActiveRecod :: Base, но, похоже, это неправильно, поскольку он настроен на сохранение нескольких объявлений в таблице базы данных.

Какой лучший способ для меня это сделать? Как должна выглядеть модель и контроллер?

Заранее спасибо, Avi

Ответы [ 4 ]

2 голосов
/ 08 марта 2016

Лучшим способом было бы добавить проверку, которая проверяет, существует ли уже одна запись.

Внутри вашей модели:

validate :check_record, on: :create #please not that validate in this case is singular

def check_record
 if Ad.all.count === 1
   errors[:base] << "You can only have one active advertisement"
 end
end
2 голосов
/ 28 августа 2009

Что ж, если вы собираетесь хранить информацию (URL, заголовок, изображение) в базе данных, я думаю, что унаследовать ее от AR - это правильно. Если они собираются сделать это через какой-либо интерфейс, я думаю, что это ваш лучший вариант.

Почему бы не разрешить несколько рекламных объявлений, но только одна из них может быть опубликована за один раз? Таким образом, вы также можете иметь историю рекламных объявлений - я не знаю, насколько важна эта часть, но она может оказаться интересной в дальнейшем.

1 голос
/ 29 августа 2009

Я бы посоветовал вам продолжить использовать ActiveRecord, но добавить логический атрибут, который определяет, какая из множества рекламных записей является активной. Я назвал это поле активным в следующем примере.

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

  1. Для активного атрибута установлено значение false
  2. Есть 0 записей с активным значением true.
  3. Для текущей записи уже установлен атрибут true в базе данных.

Следующий класс должен соответствовать вашим потребностям

class Ad < ActiveRecord::Base

  named_scope :has_active, :conditions => {:active => true}

  def validate
    errors.add_to_base "You can only have one active advertisement" 
        unless self.active_flag_valid?
  end

  def active_flag_valid?
    self.active == false || 
    Ad.has_active.size == 0 || 
    ( Ad.has_active.size == 1 && !self.active_changed?)
  end
end
1 голос
/ 28 августа 2009

Я согласен. Если вы абсолютно уверены, что он статический, его даже не нужно хранить в базе данных. Если это изменится, Rails предоставит вам create_at и updated_at практически бесплатно, поэтому получение самых последних созданных / обновленных является одним из простых способов приблизиться к отображению текущих данных.

...