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