我有与许多用户相关联的帖子。当有人评论其中一个时,我的应用会创建一条消息,该消息应该发送给与帖子相关联的用户。我想将所有已评论的帖子用户与新消息相关联。如何在没有迭代器的情况下立即执行此操作?
users.each do |user|
user.messages << message
end
答案 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