多个日期选择器的Rails数据设计

时间:2011-10-18 02:56:37

标签: ruby-on-rails database activerecord normalization

我有一个约会模型,其available_dates可以包含多个日期(例如,在1月5日,5日,6日和7日可用)。

我的问题非常基本:我应该如何存储每个活动的可用日期?

我能想到的是一个包含两列的表Avaiable_Dates:event_id和date。每个事件都有多行,每行一个日期。查询整个表格以确保我们获得事件的所有日期似乎很麻烦。哈希{event => {date1,date2,date3}}会更快,但我不知道如何使用ActiveRecord实现它。

谢谢。

2 个答案:

答案 0 :(得分:1)

我没有看到你提到的单独表的问题,我会继续使用它。随着时间的推移你也会更容易延长。

答案 1 :(得分:1)

在可用时间内使用单独的模型可能不是一个坏主意,但如果您决定使用散列路由,则可以使用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

从设计的角度来看,如果您认为您将向可用时间对象添加更多数据,那么您应该将其设置为自己的模型。否则,序列化哈希似乎没问题。