2012-06-27 15 views
5

私はRuby on Rails 3.2.2を使用しています。スコープのメソッドで、そのテーブルがまだ結合されていない場合にのみ、テーブルを「動的に」結合することができるかどうかを知りたいと思います。テーブルがまだ結合されていない場合にのみ、テーブルを「動的に」結合することは可能ですか?

def self.scope_method_name(user) 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
end 

私は、次のようなものを作りたい:それは、私が持っていることを

# Note: the following code is just a sample in order to understand what I mean. 
def self.scope_method_name(user) 
    if table_is_joined?(joining_table_name) 
    where("joining_table_name.user_id = ?", user.id) 
    else 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
    end 
end 

すると、そのを作ることをお勧め/それは可能ですか?もしそうなら、私はどのように進めるべきですか?


私は(複数のテーブルの文ので、期待どおりに動作しない照会私のSQLを作るように思われるいくつかのケースでmultiple database table statements in INNER JOIN of SQL queriesを避けるために、このアプローチを使用するので、気にすることなくscope_method_nameを使用したいです(私の場合は、データベーステーブルに参加することなく)関連するSQLクエリの懸念があります。

:あなたはClassName.scope_method_name(@user)のようなコードを実行すると(たとえば、これが起こる可能性がまだデータベーステーブルを結合していないてきたときには、SQLエラー(などのような例えば、エラー「ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'joining_table_name.user_id' in 'where clause'」)を上げることができます以前にjoining_association_nameを参加させずに、関連するjoining_table_nameテーブルに参加することなく)。

答えて

-1

アソシエーションがロードされているかどうかを確認する方法はloaded?です。あなたはそれを使ってみることができます。

if association_name.loaded? 
    where("joining_table_name.user_id = ?", user.id) 
else 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
end 
+0

あなたのコードはSQLエラーを回避しますか?(たとえば、SQL文にエラーがあります:テーブル 'joining_table_name'がSQLクエリで指定されていないか、あなたがまだ* join_association_nameに参加していない状態で、 'ClassName.scope_method_name(@user)' *のようなコードを実行したときに、関連する 'joined_table_name'テーブル)? – user12882

+0

申し訳ありませんが、私はあなたがスコープを使用しようとしているのを見ました。 'association_name.loaded?'はインスタンスに対してのみ利用可能です。あなたの質問に答えることはできませんが、レールはアソシエーションを2回ロードしないように注意しなければなりません。 – spas

+0

少なくともリンクの質問の場合、Railsは "関連付けを2回ロードしていない"ことを気にしていないようです(http://stackoverflow.com/questions/11210241/what-means-happens-when -full-the-inner-join-multiple-database-table-st?lq = 1)(コメントを読む)。 – user12882

関連する問題