rails模型中的DB关系:
Class User < ActiveRecord::Base
has_many :user_messages
has_many :messages
end
Class UserMessage < ActiveRecord::Base
belongs_to :user
belongs_to :message
end
Class Message < ActiveRecord::Base
belongs_to :user
has_many :user_messages
end
我想优化以下代码:
ids.each do |id|
user = User.find_by_id(id)
unread_count = user.user_messages.where(:folder => user.inbox_id, :read => false).count
puts "UserID #{id} ---- Unread Message count #{unread_count}"
end
有些人可以告诉我如何使用Active记录或SQL查询优化上述代码。我基本上希望减少数据库查询和上述代码完成循环的时间。
提前致谢。
答案 0 :(得分:1)
您可以这样做:
users = User.where(id: ids).includes(:user_messages)
users.each do |user|
unread_count = user.user_messages.where(:folder => user.inbox_id, :read => false).count
puts "UserID #{user.id} ---- Unread Message count #{unread_count}"
end
由于您急于加载user_messages
,因此它不会在循环内触发任何其他数据库查询。只有1个查询来获取用户及其user_messages。
或者您可以执行以下操作:
user_messages = UserMessage.joins(:user).where('folder = users.inbox_id AND read = false').group(:user_id).count
# user_messages = {1=>10, 2=>19}
# Here keys are user ids and values are no of user_messages for that user
user_messages.each do |user_id,unread_msg_count|
puts "UserID #{user_id} ---- Unread Message count #{unread_msg_count}"
end
PS:我没有测试任何代码,如果您有任何错误,请发表评论。我假设您puts "UserID #{ids}
想要输入单个用户ID并根据它修改我的代码,因为在您的代码中它会打印所有ID ids
。