【问题标题】:Ruby on Rails: How to model recurring times (weekly activities)?Ruby on Rails:如何建模重复时间(每周活动)?
【发布时间】:2011-09-16 22:07:23
【问题描述】:

在我的 Ruby on Rails 应用程序中,我有一个每周重复“活动”的“组”模型。有些活动每周只发生一天(周五晚上 6:00),而有些活动每周发生多次(周一至周五上午 8:00,或周二/周四上午 10:00)。

我无法弄清楚如何对这些数据建模,以及如何使用 Rails 创建表单来创建/更新数据。我是否创建具有日期时间字段的“活动”表?或者我是否将一周中的一天与一天中的时间分成两个单独的字段?一周发生多次的活动呢?

任何想法或建议将不胜感激。另外,如果您知道有什么可以帮助解决此问题的宝石,我将不胜感激,这样我就不必重新发明轮子了。

更新:

例如,如果我需要显示如下内容:

A组特别活动

  • 星期一晚上 10 点 - 足球比赛
  • 周二/周四上午 8 点 - 网球

B组特别活动

  • 周一至周五中午 12 点 - 午餐
  • 星期六早上 8 点 - 早餐
  • 周日下午 6 点 - 晚餐

为了使用 Ruby on Rails 建模和显示这些数据,我需要采取哪些步骤?

【问题讨论】:

    标签: ruby-on-rails database-design data-modeling


    【解决方案1】:

    https://github.com/jimweirich/texpJim Weirich 的时态表达式库是在 ruby​​ 中查询这类事物的绝佳资源。

    如果除了批量查看所有这些之外您不需要查询此集合,那么只需序列化该数据结构可能对您有用。

    但最后您可能只使用has_many :occurances,其中出现的事件从 date_time homebaked-recurrence-pattern 对开始,然后根据您需要的功能集从那里迭代。

    【讨论】:

      【解决方案2】:

      如果您认为它是正确的,那么您可以在数据库中表示和保存不同的日期和时间格式和间隔,您可能会更改它以向用户添加一些选项或删除根据您网站的发展选择相应的选项。

      我会创建两个字段,例如“date_start”和“date_end”,以及一个包含表示频率的代码的字符串字段。每个代码 3 个字符,第一个可以是 M 每月,W 每周; second 可以是 F 代表第一个,L 代表最后一个;第三个字符可以是一周中特定数字的数字,F 表示星期五。

      这里的重点是您可以通过编程方式(编码和)解码,因此如果您添加功能,您将不必重新创建数据库关系。

      【讨论】:

        【解决方案3】:

        就像一个组可以有多个活动一样,我认为一个活动可以有多个出现。我建议尝试使用出现表以这种方式对您的数据库进行建模。

        关于表单,以activity为主,发生为detail的“master-detail”表单呢?

        【讨论】:

          【解决方案4】:

          型号 组.rb

          class Group < ActiveRecord::Base
            validates_presence_of :name
            has_many :activities, :through => :group_activity
          end
          
          activity.rb
          class Activity < ActiveRecord::Base
            validates_presence_of :name
            belongs_to :group
            has_many :occurances, :through => :activity_occurance
          end
          
          occurance.rb
          class Activity < ActiveRecord::Base
            validates_presence_of :date
            belongs_to :activity
          end
          

          迁移(单独或一起) add_everything.rb

          class AddEverything < ActiveRecord::Migration
            def self.up
              create_table :groups, :force => true do |t|
                t.string  :name
                t.timestamps
              end
              create_table :group_activity, :force => true do |t|
                t.integer  :group_id, :activity_id
                t.timestamps
              end
              create_table :activities, :force => true do |t|
                t.string  :name
                t.timestamps
              end
              create_table :activity_occurance, :force => true do |t|
                t.integer  :activity_id, :occurance_id
                t.timestamps
              end
              create_table :occurance, :force => true do |t|
                t.datetime  :date
                t.timestamps
              end
            end
          
            def self.down
              drop_table :groups
              drop_table :activities
              drop_table :occurances
              drop_table :group_activity
              drop_table :activity_occurance
            end
          end
          

          这会照顾您的模型工作。在您的组 _form 视图中,我将添加您的关联组名称,并为您的活动名称添加 fields_for 和为发生事件添加 fields_for。在您出现时,使用这个方便的 jQuery 日期时间选择器(它是 jQuery 日期选择器的扩展)来填充您的出现字段:

          http://puna.net.nz/timepicker.htm

          您还应该有单独的视图,以使用其各自的表单单独管理活动。在您的显示页面中显示其他字段是非常标准的,但对于出现的情况,您可以使用类似(haml 语法):

          = @group.name
          - for activity in @group.activities
            = activity.name
            - for occurance in activity.occurances
              = occurance.date.strftime("%A at %r")
          

          希望这至少能让你开始。如果要显示 day1/day2/day3 的内容,可以添加额外的逻辑来检查 activity.occurances.size 以相应地格式化

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-19
            • 1970-01-01
            • 1970-01-01
            • 2017-10-03
            • 2016-01-31
            • 1970-01-01
            相关资源
            最近更新 更多