Как выбрать одну модель и сохранить этот выбор? - PullRequest
2 голосов
/ 01 декабря 2008

У меня есть простая модель с именем Party с соответствующей таблицей с именем parties. Также есть контроллер со всеми обычными действиями CRUD и так далее. Эта модель используется на веб-сайте, и только один пользователь-администратор имеет право редактировать стороны - все остальные могут вызывать действия GET (индекс, шоу). Пока ничего особенного.

Теперь мне нужно сделать следующее: Администратор хотел бы выбрать одну Сторону за раз для специальной презентации (выбранная Сторона отображается на начальной странице приложения). Самое главное, что в данный момент выбрана только ОДНА вечеринка.

Как бы вы решили эту проблему? Булев флаг в модели партии? Сохранить выбор (идентификатор партии) где-нибудь за пределами базы данных? Реализовать новую модель с отношением has_one к партии (мне это кажется излишним)?

Надеюсь, мое объяснение достаточно для понимания проблемы.

Ответы [ 5 ]

3 голосов
/ 01 декабря 2008

Достаточно простого атрибута "front_page" или другой модели, как вы упомянули, с использованием отношения has_one также будет хорошо.

Использование другой модели позволит вам сохранить некоторую дополнительную информацию, например, как долго она должна оставаться на первой странице (срок действия?) Или сколько раз она была показана (при условии, что вечеринка может быть представлена ​​дважды). Это действительно зависит от других требований к вашей системе.

Вы также можете обойтись простой реализацией шаблона Singleton. В Rails Wiki есть краткое описание создания объекта ActiveRecord в виде Singleton (см. Ниже): http://wiki.rubyonrails.org/rails/pages/TipsAndTricks

Создание одиночного объекта ActiveRecord

Если у вас есть стол только с одним запись, полезная для отслеживания числовая последовательность для баз данных без последовательности, вы можете использовать синглтон Модуль, включенный в ruby, выглядит так:

require 'singleton'

class Master < ActiveRecord::Base
  include Singleton
  def initialize(args=nil) super(args) if record = Master.find(:first)    
    self.attributes = record.attributes end end def next_tracking_number increment!
    (:current_tracking_number) current_tracking_number end def 
    self.next_tracking_number instance.next_tracking_number 
  end
end

Обновление:

Это очень плохой пример кода (был скопирован и вставлен из Rails Wiki, у которого не было форматирования). Я очень рекомендую книгу [Шаблоны проектирования Ruby], которая более подробно рассматривает многие шаблоны проектирования GoF (при этом делая их применимыми к приложениям Ruby). Но Google должен вернуть вам хорошие ресурсы для использования шаблона Singleton в Ruby. 2

2 голосов
/ 01 декабря 2008

Я бы выбрал логический флаг и создал бы вложенный одноэлементный ресурс (повышен), который я бы реализовал в самом PartyController (set_promoted_party and get_promoted_party actions). Для них я бы создал два новых маршрута:

PUT /parties/promoted/:party_id # to set the promoted party
GET /parties/promoted/:party_id # to get the promoted_party
1 голос
/ 01 декабря 2008

Я бы добавил вторую модель, которая имела отношение has_one, чтобы приложение оставалось RESTful и простым. Кроме того, таким образом, вы можете хранить историю особых партий и отслеживать другую значимую информацию, касающуюся особых партий.

0 голосов
/ 01 декабря 2008

Будьте проще. Поместите файл promoted_party.yml в каталог конфигурации, в который контроллеры будут писать и читать. Содержимое может быть таким простым:

--- 
party_id: 123

Готово. Если вам нужно больше целостности или более привлекательных отношений позже, реализуйте это позже, а не сейчас.

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

0 голосов
/ 01 декабря 2008

Лично я очень уверен в том, что моя база данных обеспечивает целостность данных, поэтому, вероятно, добавил бы эту дополнительную таблицу и применил бы ее в качестве ограничения внешнего ключа. Это может показаться излишним, но это единственное * решение, которое предотвращает проблемы целостности данных.

Не могли бы вы добавить его в качестве поля в таблицу / модель администратора - который будет принудительным внешним ключом для таблицы участника?

* Другим решением будет триггер базы данных, который проверяет, не являются ли другие строки выбранной стороной, но я склонен избегать таких решений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...