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

时间:2016-01-04 06:45:37

标签: ruby-on-rails ruby

我有与许多用户相关联的帖子。当有人评论其中一个时,我的应用会创建一条消息,该消息应该发送给与帖子相关联的用户。我想将所有已评论的帖子用户与新消息相关联。如何在没有迭代器的情况下立即执行此操作?

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

3 个答案:

答案 0 :(得分:4)

听起来您正在寻找 ActiveRecord::Base.update_all - 来自文档:

  

如果所有记录与一组匹配,则更新所有记录   提供的条件,限制和订单也可以提供。这个   method构造单个SQL UPDATE语句并直接发送它   到数据库。它没有实例化所涉及的模型和它   不会触发Active Record回调。

你可以这样做:

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

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

供您参考,您也可以查看此链接,了解 update_all

  

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

答案 1 :(得分:1)

AFAIK,使用标准的rails语法无法实现,但您仍可以使用普通的旧SQL:

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

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

答案 2 :(得分:0)

我看到了这个答案Can you supply arguments to the map(&:method) syntax in Ruby?

我不推荐它,但你可以通过monkey patching Symbol中的initializer课程来解决问题

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

我会推荐这样做,但我觉得玩这个很有趣。

相关问题