1

私は次のSTIセットアップを持っています:

class Cage < ActiveRecord::Base
  has_many :animals
end

class Animal < ActiveRecord::Base
  belongs_to :cage
end

class Cat < Animal
  # name = "Tom"
end

class Mouse < Animal
  # name = "Jerry"
end

次の構造を返すAnimalsテーブルでselectを実行したいと思います。

+----+-----------------------+
| ID | cat_name | mouse_name |
+----+-----------------------+
| 1  | Tom      | Jerry      | 
+----+-----------------------+

理想的には、次のようなものが欲しいです。

Cage \
  .joins(:animals)
  .select("
    cages.id,
    animals.name as case animals.type 
      when 'Mouse' then mouse_name 
      when 'Cat' then cat_name end
  ") \
  .group('cages.id')

しかし、それは機能しないので、私はこれを行いました:

Cage \
  .joins(:animals)
  .select("
    cages.id,
    case animals.type when 'Mouse' then animals.name end mouse_name end,
    case animals.type when 'Cat' then animals.name cat_name end
  ") \
  .group('cages.id')

最初のクエリを機能させる方法はありますか?そうでない場合は、2番目のクエリを作成するためのより良い/代替の方法がありますか?

4

1 に答える 1

1

最初のクエリでは、1つの式で2つの名前列を作成しようとしていますCASE。それはうまくいきません。結果セットに2つの列が必要な場合は、2つの異なるものを選択する必要があります。

2番目のクエリはより近いですが、selectに集計関数を含まないgroup-byを実行しているため、各グループからランダムな結果を取得できます。私は提案します:

...
GROUP_CONCAT(IF(animals.type='Cat',animals.name,NULL)) AS cat_name,
GROUP_CONCAT(IF(animals.type='Mouse',animals.name,NULL)) AS mouse_name
...

私が誤解していて、実際に1つの結果列に両方の名前が必要な場合は、次のようにすることができます。

GROUP_CONCAT( 
    CONCAT(animals.type,' name is: ',animals.name) 
    SEPARATOR ', '
) AS animal_names
于 2012-07-15T00:19:55.500 に答える