0

Rails 3 では、次の種類のコードを使用して MySQL データベースにクエリを実行しています。

MyData.joins('JOIN (SELECT id, name FROM sellers) AS Q
  ON seller_id = Q.id').
  select('*').
  joins('JOIN (SELECT id, name FROM users) AS T 
  ON user_id = T.id'). 
  select("*").each do |record| 
  #..........

次に、もう少し下で、次のコードを使用して「名前」にアクセスしようとします (売り手とユーザーの両方に名前の列があることに注意してください)。

str = record.name

この行は「販売者名」ではなく「ユーザー名」を表示していますが、何も表示されませんか? 名前列で複数のテーブルを結合したので、「列 '名前' はあいまいです」などのエラーが発生することはありませんか? なぜこれが起こらないのですか?

ちなみに、最初の "select('*')" 行を含めても含めなくても、コードは同じように動作します。

ありがとうございました。

4

1 に答える 1

2

まず、select2 回呼び出す必要はありません。実際に使用されるのは最後の呼び出しだけです。第 2 にselect("*")、SQL データベース (および Rails) はあいまいな列の名前を変更しないため、 を使用しないでください。代わりに、必要な追加の列に明示的な名前を付けます。

MyData.joins('JOIN (SELECT..) AS Q ON ...', 'JOIN (SELECT...) AS T ON ...').
       select('my_datas.*, T.name as t_name, Q.name as q_name').
       each do |record|
  # do something
end

このため、JOIN ステートメントでサブクエリを作成する理由はありません。

MyData.joins('JOIN sellers AS Q ON ...', 'JOIN users AS T ON ...').

belongs_to最後に、 との関連付けが既に設定されsellerているはずuserです。これは、これを行うことができることを意味します:

MyData.joins(:seller, :user).
       select("my_datas.*, sellers.name as seller_name, users.name as user_name").
       each do |record|
  # do something
end

record.seller_nameこれで、あいまいさrecord.user_nameなく呼び出すことができます。

于 2013-04-15T21:05:15.010 に答える