Проект данных Rails для многократного выбора даты - PullRequest
1 голос
/ 18 октября 2011

У меня есть модель встреч, в которой доступные_даты могут включать несколько дат (скажем, доступны 1, 5, 6 и 7 января).

Мой вопрос очень простой: как хранить доступные даты для каждого события?

Я могу вспомнить таблицу Avaiable_Dates с двумя столбцами: event_id и date.Каждое событие будет иметь несколько строк, по одной дате на строку.Похоже, обременительно запрашивать всю таблицу, чтобы убедиться, что мы получили все даты события.Хэш {event => {date1, date2, date3}} будет быстрее, но я не знаю, как реализовать его с помощью ActiveRecord.

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Не может быть плохой идеей просто использовать отдельную модель для доступного времени, но если вы решите пойти по хеш-маршруту, вы можете сделать это, используя ключевое слово 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

С точки зрения дизайна, если вы думаете, что когда-нибудь добавите больше данных к доступному объекту времени, вам следует создать его собственную модель. В противном случае сериализованный хеш выглядит нормально.

1 голос
/ 18 октября 2011

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

...