有没有更好的方法来管理Rails中使用jsonb的has_many关系



考虑到学生可以学习各种东西,我将这些东西存储在引用Studies表的jsonb列中。索引研究并不重要(目前(,我更喜欢避免使用关系表。

因此:add_column :students, :studies, :jsonb, default: []

在我的简单形式(苗条(:

= simple_form_for @student do |f|
= f.input :studies, as: :check_boxes, collection: Study.all, label_method: :name

考虑到它的简洁性,这非常有效。除了一个小细节:表单不检查以前保存的研究,因为它们的ID以字符串形式存储在jsonb数组["", "2", "12"]中,并且表单显然需要整数。

我在学生模型中添加了一个研究的值函数,但这似乎太过分了(还有.reject(&:zero?)来删除空数组值(:

def studies=(array)
# transform strings to integers and remove leading empty value
super(array.map(&:to_i).reject(&:zero?))
end

有更好的方法吗?

我认为更好的方法是使用关系表。在模型上重写赋值方法通常不是正确的方法。

JSONB很好,提供了灵活性,甚至可以很好地查询,但除非您有充分的理由在这种情况下使用它,否则您可能应该坚持使用has_many :through...关联。

无论哪种方式,取决于你如何连接一切,也许你最好把你的逻辑放在动作过滤器或做模型验证的地方,而不是覆盖赋值方法。。。

最新更新