【问题标题】:Always append new text to current text in column始终将新文本附加到列中的当前文本
【发布时间】:2021-07-24 04:19:11
【问题描述】:

我想在模型中有一个“注释”项,它始终将新/编辑表单中的任何新文本附加到任何当前存在的注释。

我在看类似的东西:

 def update
     ppe_params[:notes] = @ppe.notes + "/n" + ppe_params[:notes]
     respond_to do |format|
       if @ppe.update(ppe_params)
         format.html { gflash :success => 'PPE was successfully updated.'; redirect_to @ppe }
       else
         format.html { render :edit }
       end
     end

结束

这似乎是一个简单的解决方案,那么有哪些陷阱呢?我正在使用 Postgres,并不太担心 Postgres 中的 TEXT 列空间不足。将其移至模型中的方法是否更好?

有没有办法让 Postgres 总是将新的注释文本附加到当前列值?

【问题讨论】:

  • (1) 你的意思是"\n" 而不是"/n"? (2) 为什么不has_many :notes 每次都创建一个新笔记?您可以将它们混合在一起以用于显示目的,但您会拥有带有时间戳/作者/...的单独注释。
  • 这两点都很好。这意味着将当前笔记数据迁移到新表,但值得付出努力。跟踪日期和谁做笔记是我们想要的,这让我们一举搞定。谢谢!

标签: ruby-on-rails ruby postgresql ruby-on-rails-5


【解决方案1】:

就个人而言,我一般不会使用这种方法。您可以在更新时使用触发器来简单地附加新值而不是覆盖。 这样做的问题是,如果不禁用或绕过非常烦人的触发器,绝对没有办法清除列。

如果你必须拥有这个功能,我只是把它放在应用程序级别,而不是求助于在数据库中实现它。如果您要求,我会编写数据库代码,但这是一个糟糕的主意(从我的想法来看),我不希望有人在不考虑后果的情况下实现该代码。

【讨论】:

  • 这更像是一个评论,而不是一个实际的答案。
  • 我同意。我认为评论比实际问题的答案更有价值,但是,提到的替代方案(单独的表格)是一个可行的解决方案,效果很好。
【解决方案2】:

正如@muistooshort 指出的那样,这确实应该成为它自己的表,表中包含:comment:date:user_id,以及适当模型中的has_many/belongs_to。这就是我要走的路。感谢大家的实际检查,有时我的头脑在太多的地方我忘记了良好的数据库设计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2021-03-09
    相关资源
    最近更新 更多