私は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
テーブルに参加することなく)。
あなたのコードはSQLエラーを回避しますか?(たとえば、SQL文にエラーがあります:テーブル 'joining_table_name'がSQLクエリで指定されていないか、あなたがまだ* join_association_nameに参加していない状態で、 'ClassName.scope_method_name(@user)' *のようなコードを実行したときに、関連する 'joined_table_name'テーブル)? – user12882
申し訳ありませんが、私はあなたがスコープを使用しようとしているのを見ました。 'association_name.loaded?'はインスタンスに対してのみ利用可能です。あなたの質問に答えることはできませんが、レールはアソシエーションを2回ロードしないように注意しなければなりません。 – spas
少なくともリンクの質問の場合、Railsは "関連付けを2回ロードしていない"ことを気にしていないようです(http://stackoverflow.com/questions/11210241/what-means-happens-when -full-the-inner-join-multiple-database-table-st?lq = 1)(コメントを読む)。 – user12882