如何将数据库记录附加到rails上的ruby中的变量中

时间:2013-01-22 08:10:02

标签: ruby-on-rails ruby ruby-on-rails-3

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

这是我的代码:

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

4 个答案:

答案 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])