2015-05-04 6 views
0

У меня есть книга Модель и статус книги могут быть любыми из NEW, OLD, VERY_OLD. Он может быть NEW, OLD оба, или он может быть как OLD, так и VERY_OLD. Я хочу, чтобы сохранить выбор пользователя в базе данных. Как вы предлагаете мне это реализовать?habtm confusion .. Логический запрос

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

+0

Так что варианты: 1) NEW, 2) OLD, 3) VERY_OLD, 4) NEW & OLD и 5) OLD & VERY_OLD? – GMA

+0

Хотите ли вы легко найти книги, которые являются NEW, те, которые являются OLD, те, которые являются NEW и OLD, для больших наборов данных? –

+0

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

ответ

3

Если я правильно понял ваш вопрос правильно, есть пять возможностей для статуса книги:

  1. NEW
  2. OLD
  3. VERY_OLD
  4. NEW & OLD
  5. OLD & VERY_OLD

Предполагая, что я прав, вы можете сделать это с помощью ActiveRecord::Enum. Это потребовало бы добавить только один новый столбец в вашу БД и не требовать новой модели.

Сначала добавьте status столбец, если вы еще не получили один:

# In a migration 
add_column :books, :status, :integer 
add_index :books, :status 

(Вы также можете добавить null: false к линии add_column, если вы не хотите, чтобы это было возможно для бронирование не иметь не статуса)

Затем добавить к вашей Book модели:.

class Book < ActiveRecord::Base 

    enum status: [:new, :old, :very_old, :new_and_old, :old_and_very_old] 

end 

Это генерирует методы в книге под названием new?, old?, very_old? и т. Д. Возможно, вы захотите переопределить эти, например, так new? возвращает истину, если статус new_and_old, а также просто new:

def new? 
    status == "new" || status == "new_and_old" 
end 

Другой способ сделать это может быть, чтобы добавить логические столбцы книги под названием new, old и very_old, но это потребовало бы вы должны добавить кучу валидаций (например, чтобы убедиться, что книга не может быть «новой» и «очень старой».)

+0

Хорошо. Это кажется прекрасным. Итак, вы имеете в виду: Создайте столбец статуса в таблице книг и сохраните значения в виде «NEW», «OLD», «VERY_OLD», «NEW_OLD», «NEW_VERY_OLD», «OLD_VERY_OLD» в столбце состояния таблицы книг. После этого создайте перечисление в модели (как вы описали).И переопределить их так же: 'def new?' 'status ==" NEW "|| status == "NEW_OLD" || status == "NEW_VERY_OLD" ' ' end' –

+0

yes, за исключением того, что вы должны использовать строчные значения для своих статусных имен, так как это соглашение Rails/Ruby. Итак, 'enum status: [: new ...]', а не 'enum status: [: NEW ...]'. Первый определил бы метод «new?», Затем второй определил бы один, называемый «NEW?», Который не очень условный! – GMA

+0

Aahaa. Это то, что я искал. :) –