我根据城市名称从数据库中获取了所有用户。
这是我的代码:
@othertask = User.find(:all, :conditions => { :city => params[:city]})
@othertask.each do |o|
@other_tasks = Micropost.where(:user_id => o.id).all
end
我的问题是当循环完成时,@other_task
仅保留最后一个记录值。
是否可以将所有ID记录附加到一个变量中?
答案 0 :(得分:6)
你应该使用这样的联接,而不是循环并进行N个额外的查询,每个用户一个。正如您现在所拥有的那样,您的代码首先获得具有给定城市属性值的所有用户,然后对于每个用户再次查询数据库以获得微博({ {1}})。这是非常低效的。
您正在搜索具有城市Micropost.where(:user_id => o.id)
的用户的所有微博,对吗?然后,无需先找到所有用户,而是直接查询微博表:
params[:city]
这将找到用户的@posts = Micropost.joins(:user).where('users.city' => params[:city])
属性等于city
的所有帖子。
P.S。我强烈建议您阅读Ruby on Rails guide on ActiveRecord associations以获取有关如何有效使用关联的更多详细信息。
答案 1 :(得分: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
答案 2 :(得分: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
由于使用'='运算符,您只获取最后一条记录,而是需要使用'&lt;&lt;' ruby中的运算符,它将传入的记录追加到指定的数组中。 :)
答案 3 :(得分:0)
尝试:
用户模型:
has_many :microposts
Micropost模型:
belongs_to :user
查询
@Microposts = Micropost.joins(:user).where('users.city' => params[:city])