2012-04-20 3 views
1

Rails 3アプリで、親関連の列が等しいレコードが特定の文字列であるレコードを検索しようとしています。たとえば、カテゴリ名= "my_category"の投稿です。Rails 3のbelongs_to関連の列を照会する最も効率的な方法は何ですか?

class Post 
    belongs_to Category 
end 

class Category 
    has_many Posts 
end 

カテゴリには名前列が含まれていますが、これは検索を実行するために使用できる唯一のデータです。だから、私はcategory_idで直接フィルタリングすることはできません。

これを実行する最も効率的な方法は何ですか?私は彼らがうまくいくはずのようないくつかのオプションを試しましたが、そうしませんでした!

Post.joins(:category).where('category.name'=>'my_category') 
Post.joins(:category).where(:category=>{:name=>'my_category'}) 
Post.includes(:category).where('category.name'=>'my_category') 
Post.includes(:categories).where('category.name'=>'my_category') 
Post.includes(:category).where(:category=>{:name=>'my_category'}) 

私は2つのライン

category=Category.where(:name=>"my_category") 
Post.where(:category_id=>category) 

でこれを行う方法を見ることができます。しかし、私はいくつかのRailsの魔法を見下ろすていますかしら?申し訳ありませんが、それはノブの質問ですが、私はまだ学んでいます!

答えて

2
Post.joins(:category).where(:categories => { :name => "my_category" }) 

ここで、引数:categoriesはWHERE部分で複数であることに注意してください。

+0

おかげで@ blackbird07!正確に私が探していたこと、単一のデータベース呼び出し。私はとても近く、カテゴリを複数形にするだけでした。これらの複雑なアクティブレコードクエリは、常に私を混乱させる。私はいつもヒットとミス、試行錯誤のような気がして、正しい構文を取るかどうかはわかりません。私に役立つかもしれない有用な参考資料、またはあなたの経験則をお持ちですか?もう一度ありがとう! –

+0

うん、あまりにも痛みを感じる。私はいつもレールガイドhttp://guides.rubyonrails.org/active_record_querying.htmlとhttp://guides.rubyonrails.org/association_basics.htmlとAPIドキュメントhttp://api.rubyonrailsを見ています。 org/classes/ActiveRecord/Base.htmlを参照してください。後者の「結合」を検索すると、次の例が見つかります:学校と:学校 – emrass

+0

そして私も何かを学びました!ありがとうblackbird07 – Edward

1

has_many関係で得られる方法を使用します。

コメントどおり正しくないオリジナル

Category.where(:name => "my_category").posts 

あなたはPostモデルのcategory_id列を持って提供

Category.find_by_name("my_category").posts 

または

Category.where(:name => "my_category").first.posts 

を修正しました。

+0

これは動作しません。これは、 'Category.where'が単一ではなくエントリの配列を返すためです。 – emrass

+0

ありがとうございます。これは2つのSELECT文になります.1つはカテゴリ用、2つ目は投稿用 – emrass

+0

ありがとうジョン!本当に素晴らしい答え。私は自分のコードを整理するために何か新しいことを学んだ。最小のデータベースとのやり取りのために私はブラックバードへの答えを与えました。しかし、助けてくれてありがとう! –

1

@ blackbird07さんへの@John Beynonさんの回答が正しいです。

あなたは

Category.find_by_name("my_category").posts 

を試してみてくださいfind_byヘルパーは単一のオブジェクトではなく配列を返します。

+0

これは1の代わりに2つのselectステートメントになります.1つはカテゴリのため、もう1つは投稿の – emrass

+0

@edwardです。私は何か新しいことを学んだ。私は単一データベース呼び出しのためにblackbirdへの答えを与えました。しかし、助けていただきありがとうございます。 –

関連する問題