【问题标题】:Rails data design for multiple date picker多日期选择器的 Rails 数据设计
【发布时间】:2011-10-18 02:56:36
【问题描述】:

我有一个 Appointment 模型,它的 available_dates 可以包含多个日期(例如,1 月 1 日、5 日、6 日和 7 日可用)。

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

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

谢谢。

【问题讨论】:

  • 序列化意味着没有查询,除非您序列化 xml 并且您的数据库支持 x-query。所以在你采取序列化路线之前要考虑清楚。

标签: ruby-on-rails database activerecord normalization


【解决方案1】:

在可用时间使用单独的模型可能不是一个坏主意,但是如果您决定采用哈希路由,则可以使用 serialize 关键字。您必须告诉 ActiveRecord 对变量进行序列化,然后它会在您访问哈希时自动进行序列化和反序列化。

在文本列中保存数组、哈希和其他不可映射的对象

Active Record 可以使用 YAML 序列化文本列中的任何对象。为此,您必须通过调用类方法序列化来指定它。这使得存储数组、哈希和其他不可映射的对象成为可能,而无需做任何额外的工作。

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

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

【讨论】:

    【解决方案2】:

    我认为您提到的单独表格没有问题,我会同意的。以后扩展也更容易,到时候你会很感激的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多