2

我根据城市名称从数据库中获取所有用户。

这是我的代码:

@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 记录附加到一个变量中?

4

4 回答 4

6

您应该为这样的事情使用连接,而不是循环并进行 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 指南,以了解有关如何有效使用关联的更多详细信息。

于 2013-01-22T08:22:14.603 回答
4

你可以通过以下方式做到这一点

 @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
于 2013-01-22T08:12:57.650 回答
0

这是更新的代码:

@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​​ 中使用 '<<' 运算符,它将传入的记录附加到指定的数组中。:)

于 2013-01-22T08:18:22.683 回答
0

尝试:

用户型号:

has_many :microposts

微贴模型:

belongs_to :user

询问

@Microposts = Micropost.joins(:user).where('users.city' => params[:city])
于 2013-01-22T08:19:54.600 回答