如何一次将多个用户与一条消息关联起来



我有一些帖子与许多用户相关。当有人评论其中一条时,我的应用程序会创建一条消息,应该发送给与帖子相关的用户。我想将所有发表评论的帖子用户与新消息相关联。如何在没有迭代器的情况下一次完成?

users.each do |user| 
  user.messages << message
end

听起来您正在从文档中查找ActiveRecord::Base.update_all

如果所有记录与一组还可以提供所提供的条件、限制和订单。这方法构造一个SQL UPDATE语句并直接发送到数据库。它没有实例化所涉及的模型不会触发活动记录回调。

你可以做一些类似的事情:

users.update_all(:messages => "your message")

我猜您的users对象中有所有与同一帖子相关的用户。

为了供您参考,您也可以查看有关update_all的链接:

使用给定的详细信息更新当前关系中的所有记录。这方法构造一个SQL UPDATE语句并直接发送到数据库。它没有实例化所涉及的模型不会触发活动记录回调或验证。传递的值到update_all将不经过ActiveRecord的类型转换行为它应该只接收可以按原样传递给的值SQL数据库。

AFAIK,这是用标准rails语法无法实现的,但您仍然可以自由地使用普通的旧SQL:

ActiveRecord::Base.connection.execute %Q{
  UPDATE users
  SET message_id = #{message.id}
  WHERE post_id = #{post.id}
}

上面的查询可能并不完全正确,因为您没有提供关系模型,但我想您已经明白了。

我看到了这个答案。你能为Ruby中的map(&:method)语法提供参数吗?

我不推荐它,但你可以通过monkey patching破解你的方法,initializer中的Symbol类类似

class Symbol
  def call(*args, &block)
    ->(caller, *rest) { caller.send(self, *rest, *args, &block) }
  end
end

在你的用户模型中添加一个简单的方法,比如

def addMessage(message)
   self.messages << message
end

在你的代码中简单地替换这个

users.each do |user| 
  user.messages << message
end

带有

users.map(&:addMessage.(message))

这实际上是一样的,但它将迭代风格的代码隐藏为一个简单的map

我不建议这样做,但我觉得和它一起玩很有趣

相关内容

最新更新