考虑到学生可以学习各种东西,我将这些东西存储在引用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...
关联。
无论哪种方式,取决于你如何连接一切,也许你最好把你的逻辑放在动作过滤器或做模型验证的地方,而不是覆盖赋值方法。。。