Не может быть плохой идеей просто использовать отдельную модель для доступного времени, но если вы решите пойти по хеш-маршруту, вы можете сделать это, используя ключевое слово serialize. Вы должны указать ActiveRecord сериализовать переменную, а затем она будет выполнять сериализацию и десериализацию автоматически при каждом обращении к хешу.
Сохранение массивов, хэшей и других не отображаемых объектов в текстовых столбцах
Active Record может сериализовать любой объект в текстовых столбцах, используя YAML. Для этого вы должны указать это при вызове метода класса serialize. Это позволяет хранить массивы, хэши и другие не отображаемые объекты без какой-либо дополнительной работы.
class User < ActiveRecord::Base
serialize :preferences
end
user = User.create(:preferences => { "background" => "black", "display" => large })
User.find(user.id).preferences # => { "background" => "black", "display" => large }
Вы также можете указать параметр класса в качестве второго параметра, который вызовет исключение, если сериализованный объект будет получен как потомок класса, не входящего в иерархию.
class User < ActiveRecord::Base
serialize :preferences, Hash
end
user = User.create(:preferences => %w( one two three ))
User.find(user.id).preferences # raises SerializationTypeMismatch
При указании параметра класса значением по умолчанию для этого атрибута будет новый экземпляр этого класса.
class User < ActiveRecord::Base
serialize :preferences, OpenStruct
end
user = User.new
user.preferences.theme_color = "red"
С rubyonrails.org
С точки зрения дизайна, если вы думаете, что когда-нибудь добавите больше данных к доступному объекту времени, вам следует создать его собственную модель. В противном случае сериализованный хеш выглядит нормально.