在 Rails 中存储清单结果的好方法是什么?
What would be a good approach for storing the results of a checklist in Rails?
问题:
我需要创建一个允许 "admin" 用户创建清单的应用程序。每个 清单 有:许多 项 。用户将能够根据自己的选择在清单中添加和删除项目。 (通过像 Cocoon 这样的 gem,因为它可以优雅地处理嵌套资源。)
示例表单如下所示:
清单
- 项目
- 项目
- 项目
[添加项目 +]
创建表单后,普通用户就可以complete/follow 核对清单。选中的是 good/true,未选中的是 bad/false.
汽车
- 检查机油 [复选框]
- 检查轮胎 [复选框]
- 检查灯光 [复选框]
[提交]
这是困难的部分。我考虑过的一种方法...
创建属于清单模型的记录模型,
清单
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]
这样,用户可以多次完成清单,然后 "admin" 可以调出以前清单的结果。
问题 A
这似乎可行,除非 "admin" 用户想要编辑清单。如果他们从清单中删除 "item",即使我可以从关联中删除 "item","item" 也必须保留在数据库中。否则,如果 Oil 的 ID 为 2,并且 Oil 在编辑中被删除,那么记录的 list_history 散列将具有 [2 => true],这是一个指向任何地方的键。我可以想象积压的物品堆积如山。
问题 B
我不确定这是否是解决此问题的最佳方法。我已经使用 rails 2 1/2 年了,但感觉仍然和第一天一样。(实际上,我觉得我知道的更少。)也许有更好的解决方案角落,我还没有想到。
这真的应该是评论。
也许结构如下:
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)
用户项
为每个用户条目加入 table。
用户
您的用户模型。
问题:
我需要创建一个允许 "admin" 用户创建清单的应用程序。每个 清单 有:许多 项 。用户将能够根据自己的选择在清单中添加和删除项目。 (通过像 Cocoon 这样的 gem,因为它可以优雅地处理嵌套资源。)
示例表单如下所示:
清单
- 项目
- 项目
- 项目
[添加项目 +]
创建表单后,普通用户就可以complete/follow 核对清单。选中的是 good/true,未选中的是 bad/false.
汽车
- 检查机油 [复选框]
- 检查轮胎 [复选框]
- 检查灯光 [复选框]
[提交]
这是困难的部分。我考虑过的一种方法...
创建属于清单模型的记录模型,
清单
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]
这样,用户可以多次完成清单,然后 "admin" 可以调出以前清单的结果。
问题 A
这似乎可行,除非 "admin" 用户想要编辑清单。如果他们从清单中删除 "item",即使我可以从关联中删除 "item","item" 也必须保留在数据库中。否则,如果 Oil 的 ID 为 2,并且 Oil 在编辑中被删除,那么记录的 list_history 散列将具有 [2 => true],这是一个指向任何地方的键。我可以想象积压的物品堆积如山。
问题 B
我不确定这是否是解决此问题的最佳方法。我已经使用 rails 2 1/2 年了,但感觉仍然和第一天一样。(实际上,我觉得我知道的更少。)也许有更好的解决方案角落,我还没有想到。
这真的应该是评论。
也许结构如下:
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)
用户项 为每个用户条目加入 table。
用户 您的用户模型。