我有一个约会模型,其available_dates可以包含多个日期(例如,在1月5日,5日,6日和7日可用)。
我的问题非常基本:我应该如何存储每个活动的可用日期?
我能想到的是一个包含两列的表Avaiable_Dates:event_id和date。每个事件都有多行,每行一个日期。查询整个表格以确保我们获得事件的所有日期似乎很麻烦。哈希{event => {date1,date2,date3}}会更快,但我不知道如何使用ActiveRecord实现它。
谢谢。
答案 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"
从设计的角度来看,如果您认为您将向可用时间对象添加更多数据,那么您应该将其设置为自己的模型。否则,序列化哈希似乎没问题。