Сортировать по состоянию в базе данных - PullRequest
4 голосов
/ 26 января 2011

Учитывая, что у меня есть модель house, и она живет в нескольких состояниях, что-то вроде этого: Dreaming —> Planning —> Building —> Living —> Tearing down

Если я хочу получить, скажем, десять домов из базы данных и заказать их по состояниюполе, я бы сначала получил все дома в состоянии Building, затем Dreaming, затем Living,…

Можно ли получить все дома из базы данных и упорядочить их по состоянию в том порядке, в каком они были перед извлечением ?Это означает, что сначала все дома находятся в состоянии Dreaming, затем Planning и т. Д. Например, указав порядок в массиве для сравнения сортов.

Я бы хотел избежать этого в Ruby послеизвлек все записи, а также я бы не хотел использовать идентификаторы для состояний.

После прочтения реализаций enum, я думаю, если я смогу заставить это работать, я попытаюсь объединить enum column plugin с плагином state_machine , чтобы добиться того, чего я добиваюсь.Если бы кто-то делал что-то подобное раньше (особенно комбинацию под Rails 3), я был бы благодарен за ввод!

Ответы [ 3 ]

3 голосов
/ 26 января 2011

Вот некоторая информация о том, как использовать SQL ENUM в рельсах - они относительно переносимы в базе данных и делают примерно то, что вы хотите - http://www.snowgiraffe.com/tech/311/enumeration-columns-with-rails/

3 голосов
/ 26 января 2011

Если вы используете MySQL, то решение состоит в том, чтобы сделать ORDER BY FIELD (состояние, «Строительство», «Сновидения», «Жизнь», ...):

House.order("FIELD(state, 'Building', 'Dreaming', 'Living', ...)")
2 голосов
/ 26 января 2011

Если вы хотите заказать коллекцию по определенным критериям, вы должны где-то хранить эти критерии.

Я не знаю, идет ли это вразрез с вашими критериями "не в рубине", но я бы, вероятно, сделал что-то вроде этого:

class House < ActiveRecord::Base
  STATES { 0 => "Dreaming",
           1 => "Planning",
           2 => "Building",
           3 => "Living",
           4 => "Tearing Down" }

  validates_inclusion_of :state, :in => STATES.keys

  def state_name
    STATES[self.state]
  end
end

@houses = House.order("state")

В этом случае состояние поля БД является целымвместо строки.Это делает его очень эффективным как для хранения базы данных, так и для запросов.

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

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