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 レコードを 1 つの変数に追加することは可能ですか?

4

4 に答える 4

6

ユーザーごとに1つずつ、ループしてN個の追加クエリを作成するのではなく、このようなものに結合を使用する必要があります。これで、コードは最初に特定の都市属性値を持つすべてのユーザーを取得し、次にユーザーごとにDBに再度Micropost.where(:user_id => o.id)クエリを実行してマイクロポスト( )を取得します。それは非常に非効率的です。

params[:city]あなたは、都市が正しいユーザーを持つすべてのマイクロポストを検索していますか?次に、最初にすべてのユーザーを見つける必要はありません。代わりに、micropostsテーブルに直接クエリを実行します。

@posts = Micropost.joins(:user).where('users.city' => params[:city])

cityこれにより、ユーザーがに等しい属性を持つすべての投稿が検索されますparams[:city]

psアソシエーションを効果的に使用する方法の詳細については、ActiveRecordアソシエーションに関するRubyonRailsガイドを読むことを強くお勧めします。

于 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 に答える