【问题标题】:Is there a better way to manage has_many relationship with jsonb in Rails?有没有更好的方法来管理 Rails 中与 jsonb 的 has_many 关系?
【发布时间】:2020-03-07 00:47:57
【问题描述】:

考虑到可以学习各种事物的学生,我将它们存储在引用研究表的 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"] 中,并且表单显然需要整数。

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

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

有没有更好的办法?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 simple-form jsonb has-many


    【解决方案1】:

    我想说更好的方法是使用关系表。覆盖模型上的分配方法通常不是正确的方法。

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

    无论哪种方式,取决于你如何连接所有东西,也许你最好将你的逻辑放在动作过滤器或你进行模型验证的地方而不是覆盖分配方法......

    【讨论】:

    • 不是strong的原因,只是不需要关系,为什么要膨胀db呢?我接受了将其放入自定义 validate 方法(我已经拥有)的建议。我不知道你可以(或应该)这样做。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多