【发布时间】: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,它连接User和NewsItem并有一个读取列,然后unread就成为一个范围 -
好的,谢谢,但从长远来看,表格行会不会太多? (一个 NewsItem 将为每个用户创建一行...)
-
窄表中的大量行不是问题,不断增长的 YAML 块是问题。您最好忘记
serialize的存在并坚持使用正确规范化的表,关系数据库非常擅长处理表。 -
@Tintin81 在第二个虽然你可以使用
UserReadNewsItems代替,然后反向范围将导致未读新闻项目。这样,您仅在用户“阅读”新闻项目时添加记录。
标签: ruby-on-rails ruby serialization