【问题标题】:What would be a good approach for storing the results of a checklist in Rails?在 Rails 中存储清单结果的好方法是什么?
【发布时间】:2015-05-24 05:08:37
【问题描述】:

问题:

我需要创建一个允许“管理员”用户创建清单的应用程序。每个清单都有:许多项目。用户将能够根据自己的选择在清单中添加和删除项目。 (通过像 Cocoon 这样的 gem,因为它非常优雅地处理嵌套资源。)

示例表单如下所示:


清单

  1. 项目
  2. 项目
  3. 项目

[添加项目+]


创建表单后,普通用户就可以完成/遵循清单。选中是好/真,未选中是坏/假。


汽车

  1. 检查机油 [复选框]
  2. 检查轮胎 [复选框]
  3. 检查灯 [复选框]

[提交]


这是困难的部分。我考虑过的一种方法...

创建一个属于 Checklist 模型的 Record 模型,

清单

   class Checklist < ActiveRecord::Base
      has_many :records
    end

记录

class Record < ActiveRecord::Base
  belongs_to :checklist
end

然后,将结果序列化为哈希...

class Record < ActiveRecord::Base
  belongs_to :checklist

  serialize :list_history, Hash
end

我会使用 item.id 作为键,用户输入真/假作为值。因此,存储的结果如下所示:

[ 2 => true, 54 => true, 34 => false]

这样,用户可以多次完成检查表,然后“管理员”可以调出以前检查表的结果。

问题 A

这似乎可行,除非“管理员”用户想要编辑清单。如果他们从清单中删除“项目”,即使我可以从关联中删除“项目”,“项目”也必须保存在数据库中。否则,如果 Oil 的 ID 为 2,并且在 Edit 中删除了 Oil,则记录的 list_history 哈希将具有 [2 => true],这是一个指向无处的键。我可以想象积压的物品堆积如山。

问题 B

我不确定这是否是解决此问题的最佳方法。我已经使用 Rails 2 1/2 年了,仍然感觉就像我在第一天所做的那样。(实际上,我觉得我知道的更少。)也许有一个更好的解决方案指日可待,我还没想到。

【问题讨论】:

    标签: ruby-on-rails ruby serialization checkbox


    【解决方案1】:

    这确实应该是一条评论。

    也许结构如下:

    class Checklist < ActiveRecord::Base
      has_many :items
    end
    
    class Item < ActiveRecord::Base
      belongs_to :checklist
      has_many :user_items, dependent: :destroy
      has_many :users, through: :user_items
    end
    
    class UserItem
      belongs_to :item
      belongs_to :user
    end
    
    class User
      has_many :user_items, dependent: :destroy
      has_many :items, through: :user_items
    end
    

    清单 整个列表

    项目 每个任务

    user_item 关系上的依赖销毁将在销毁时删除与父级关联的记录。(解决问题 A

    用户项 每个用户条目的联接表。

    用户 您的用户模型。

    【讨论】:

    • 这是一个很好的解决方案。我们经常想将我们的对象强制放入数据库,而不是按照数据库的“方式”做事。有时您必须让数据库按照它想要的方式完成工作,因为这就是它的设计目的。像users_items 这样的连接表是表示这些数据的好方法,数据库将非常有效地处理对它的调用。然后 Rails 可以从查询中返回一个哈希给你。
    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 2014-09-17
    • 2012-09-02
    • 2014-04-12
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多