

Railsで生sqlを利用して下記のようなsqlを書きました。

[code]

    【Like table】
    id
    action_user_id
    target_user_id
    
    sql
    @user = ActiveRecord::Base.connection.select('select target_user_id, count(id)  from Likes where action_user_id is ##### group by target_user_id order by count(id)')
    
[/code]

上記の###にパラメータを渡し、

[code]

    @id = User.find(#).id
    @user = ActiveRecord::Base.connection.select('select target_user_id, count(id)  from Likes where action_user_id is @id group by target_user_id order by count(id)')
    
[/code]

のようにするにはどうしたらよいでしょうか。

アドバイスお願いします。


CC BY-SA 3.0
2015-05-25T14:30:40.717
10610
2015-05-25T22:40:16.673
5891
question
ruby-on-rails sql
Railsで生SQLを使う際にパラメータを利用する方法


(直接の回答ではありません)
目的が生SQLを書くことでは無く、そのSQLと等価なことをしたいというのであれば、ActiveRecordを普通に使うことで実現可能です。

[code]

    @user = Like.where(:action_user_id => @id).group(:target_user_id).order("count(id)").select("target_user_id, count(id) AS count")
    @user.map { |u| [u.target_user_id, u.count] }
    #=> [[1, 4], [2, 4], [0, 5], [3, 10], [4, 12]] こんな感じで出ます
    
[/code]

もちろん、`where("action_user_id = ?", @id)` としてプレースホルダを使うこともできます。


CC BY-SA 3.0
2015-05-25T17:01:29.053
10614
2015-05-25T17:01:29.053
76
10610
answer


現在のrails guide を読む限り #select_all が推奨されているように思えます。SQL処理の結果をActiveRecordで受け取るなら
#find_by_sql が使えますがいかがでしょうか。  
[find_by_sql](http://guides.rubyonrails.org/active_record_querying.html#finding-
by-sql)  
[select_all](http://guides.rubyonrails.org/active_record_querying.html#select-
all)  
あと、月並みな考え方ですが、サンプルコードにあるSQLの中に @id
を埋め込むのは、文字列に直接インターポレーション(#{...})するスタイルが使えるので、コーディング上の理由等で差し支えがないのであれば、そのスタイルを使うので十分かと思います。

[code]

    "select target_user_id, count(id)  from Likes where action_user_id = #{@id} group by target_user_id order by count(id)"
    
[/code]


CC BY-SA 3.0
2015-05-25T22:40:16.673
10619
2015-05-25T22:40:16.673
9403
10610
answer