我根据城市名称从数据库中获取所有用户。
这是我的代码:
@othertask = User.find(:all, :conditions => { :city => params[:city]})
@othertask.each do |o|
@other_tasks = Micropost.where(:user_id => o.id).all
end
我的问题是当循环完成时,@other_task
只保存最后一个记录值。
是否可以将所有 ids 记录附加到一个变量中?
我根据城市名称从数据库中获取所有用户。
这是我的代码:
@othertask = User.find(:all, :conditions => { :city => params[:city]})
@othertask.each do |o|
@other_tasks = Micropost.where(:user_id => o.id).all
end
我的问题是当循环完成时,@other_task
只保存最后一个记录值。
是否可以将所有 ids 记录附加到一个变量中?
您应该为这样的事情使用连接,而不是循环并进行 N 个额外的查询,每个用户一个。正如您现在所拥有的,您的代码首先获取具有给定城市属性值的所有用户,然后对于每个用户,您再次查询数据库以获取微博 ( Micropost.where(:user_id => o.id)
)。这是极其低效的。
您正在搜索所有用户所在城市为 的微博,对params[:city]
吗?那么就不需要先查找所有用户,而是直接查询微博表:
@posts = Micropost.joins(:user).where('users.city' => params[:city])
这将找到所有用户具有city
等于的属性的帖子params[:city]
。
ps 我强烈建议阅读有关 ActiveRecord 关联的 Ruby on Rails 指南,以了解有关如何有效使用关联的更多详细信息。
你可以通过以下方式做到这一点
@othertask = User.find(:all, :conditions => { :city => params[:city]})
@other_tasks = Array.new
@othertask.each do |o|
@other_tasks << Micropost.where(:user_id => o.id).all
end
这是更新的代码:
@othertask = User.find_all_by_city(params[:city])
@other_tasks = Array.new
@othertask.each do |o|
@other_tasks << Micropost.find_all_by_user_id(o.id)
end
由于使用 '=' 运算符,您只能获取最后一条记录,而不是您需要在 ruby 中使用 '<<' 运算符,它将传入的记录附加到指定的数组中。:)
尝试:
用户型号:
has_many :microposts
微贴模型:
belongs_to :user
询问
@Microposts = Micropost.joins(:user).where('users.city' => params[:city])