在Rails中存储核对清单结果的好方法是什么?

时间:2015-03-20 17:29:09

标签: ruby-on-rails ruby serialization checkbox

问题:

我需要创建一个允许“admin”用户创建清单的应用程序。每个核对表都有:许多。用户可以根据需要在清单中添加和删除项目。 (通过像Cocoon这样的宝石,因为它可以优雅地处理嵌套资源。)

示例表单看起来像这样:


清单

  1. 项目
  2. 项目
  3. 项目
  4. [添加项目+]


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


    汽车

    1. 检查油[复选框]
    2. 检查轮胎[复选框]
    3. 检查指示灯[复选框]
    4. [提交]


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

      创建一个属于清单模型的记录模型

      清单

         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作为键,并将用户的true / false输入作为值。因此,存储的结果看起来像:

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

      这样,用户可以多次完成一个清单,然后“管理员”可以提取以前清单的结果。

      问题A

      这似乎可行,除了“admin”用户想要编辑核对清单的时候。如果他们从清单中删除“项目”,即使我可以从关联中删除“项目”,“项目”也必须保存在数据库中。否则,如果Oil的ID为2,并且在Edit中删除了Oil,则记录的list_history哈希将具有[2 =&gt;是的,这是一个指向无处的关键。我可以看到积压的物品积压。

      问题B

      我不确定这是否是解决此问题的最佳方法。我已经使用rails 2年半了,但仍然觉得我在第1天做了。(实际上,我觉得我知道的更少。)也许有一个更好的解决方案即将到来,我还没有想到。

1 个答案:

答案 0 :(得分: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

<强> UserItems 为每个用户条目加入表。

用户 您的用户模型。