【问题标题】:Most performant way to add array item to serialized array column in Ruby on Rails?在 Ruby on Rails 中将数组项添加到序列化数组列的最高效方法?
【发布时间】:2022-01-11 19:30:58
【问题描述】:

在我的 Rails 6 应用程序中,我有以下两个模型:

class User < ApplicationRecord

  serialize :unread_news_item_ids, Array

end

class NewsItem < ApplicationRecord

  after_create :inform_users

private

  def inform_users
    User.all.each do |user|
      user.unread_news_item_ids << id
      user.save(:validate => false)
    end
  end

end

每当我(“管理员”)创建一个新的NewsItem 时,我希望我的用户收到通知,因此我在serialized 列中跟踪unread_news_items_ids 我的Users 表。

上面的代码可以工作,但是它给数据库带来了繁重的工作量,因为它分别保存了每个用户。

有没有更高效的方法来实现这一点?

我正在考虑类似于update_all 的东西,但我想这不适用于序列化的数据库列(?)。

【问题讨论】:

  • 用适当的索引创建一个单独的UnreadNews(belongs_to: user, belongs_to: news) 表。序列化数组根本无法很好地扩展
  • 我的建议是创建一个中间模型,可能类似于UserNewsItems,它连接UserNewsItem 并有一个读取列,然后unread 就成为一个范围
  • 好的,谢谢,但从长远来看,表格行会不会太多? (一个 NewsItem 将为每个用户创建一行...)
  • 窄表中的大量行不是问题,不断增长的 YAML 块是问题。您最好忘记serialize 的存在并坚持使用正确规范化的表,关系数据库非常擅长处理表。
  • @Tintin81 在第二个虽然你可以使用 UserReadNewsItems 代替,然后反向范围将导致未读新闻项目。这样,您仅在用户“阅读”新闻项目时添加记录。

标签: ruby-on-rails ruby serialization


【解决方案1】:

好的,我决定采纳你的建议并创建了一个连接表ReadNewsItems,效果很好。我发布了一个后续问题here

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 2010-10-11
    • 2010-11-21
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2016-10-16
    • 2011-09-05
    相关资源
    最近更新 更多