Но когда я запрашиваю модуль Status в консоли rails:
Status.all
я получаю сообщение об ошибке:
NoMethodError (undefined method `all' for Status:Module)
.all
запрашивает все записи класса ActiveRecord. Status
не является классом ActiveRecord. Это даже не класс, это модуль.
Что касается User.statuses.all
, я не вижу, где определяется statuses
.
Ruby::Enum
имеет добавил некоторые константы и методы, но Rails не знает о них. Вам придется интегрировать их в Rails самостоятельно.
В Rails уже есть интегрированные перечисления .
module Status
extend ActiveSupport::Concern
included do
# It will take an Array, but it's good practice to be explicit.
enum status: {ordered: 0, cancelled: 1, waiting: 2}
end
end
User.statuses
вернет HashWithIndifferentAccess
ваших статусов.
Обратите внимание, что эти перечисления сопоставлены с целыми числами, строки побеждают точку перечисления. Сохранение вашего статуса в виде целого числа сэкономит вам потенциально много места. Rails будет обрабатывать отображение целых чисел в строки и обратно для вас.
Обязательно измените вашу таблицу, чтобы использовать целочисленный статус: t.string "status"
. Чтобы пользователи не имели статус «включено», вам нужно задать либо значение по умолчанию, либо null: false
.
Я хочу видеть Порядок, а не порядок на странице просмотров. Я хочу видеть Не заказано и не не упорядочено на странице просмотров. Я также хочу, чтобы значения статуса сохранялись в базе данных, а не целые числа, такие как 0, 1, 2. - Promise Preston 12 сек. go
Подробно о том, как отображаются данные, не принадлежат в базе данных. Самое простое - это использовать humanize
.
# ordered becomes Ordered. not_waiting becomes Not waiting.
User.statuses.keys.collect { |status| status.humanize }
Вы можете добавить sh в модуль Status.
module Status
...
class_methods do
def show_statuses
statuses.keys.collect { |status| status.humanize }
end
end
end
User.show_statuses
Делать это как выберите ...
<%= f.select :status, User.statuses.collect { |status,id| [status.humanize,id] } %>
И вы также можете добавить sh в Status.
module Status
...
class_methods do
...
def statuses_for_select
statuses.collect { |status,id| [status.humanize,id] }
end
end
end
<%= f.select :status, User.statuses_for_select %>
По мере усложнения деталей отображения ваши модели будут становиться толстыми. Тогда вам захочется добавить его в декоратор .