3

ここでいくつかの問題が発生しました。ActiveRecord リレーションをレンダリングするための find_by_sql リクエストを作成できません。実際、新しいリクエストを行うにはアクティブレコードのリレーションが必要です:

@searches = @searches.find_by_sql('SELECT *, COUNT( follower_id ) FROM follows GROUP BY followable_id LIMIT 0 , 3') if params[:only_famous_projects]
@project_pages = @project_pages.where(:project_id => @searches.pluck(:'followable.id')) if params[:only_famous_projects]

「pluck」はアクティブレコード関係がないと使えません。したがって、SQL リクエストを Activerecord リクエストに変換する必要があると思います。しかし、ActiveRecord で "count" を使用するとすぐに、大きな問題が発生します。最後に ActiveRecord リレーションはありませんが、FixNum があります。

もう答えがどこにあるのかわかりません。助けていただければ本当に感謝しています。ありがとう

4

2 に答える 2

1

find_by_sqlで呼び出した場合にのみ ActiveRecord オブジェクトを返しますYourModel.find_by_sql

ActiveRecord クエリ インターフェイスを使用してみませんか。それは計算で良い仕事をします。

更新しました

@searches = @searches.group(:followable_id).limit(3).offset(0).count(:follower_id) if params[:only_famous_projects]

それぞれのカウントを含むハッシュが得られることに注意してくださいfollowable_id

LIMIT 0, 3と同等ではありませんLIMIT 3か?

于 2012-06-20T09:03:37.213 に答える
0

COUNTデータベースに行数をカウントするように要求したため、常に FixNUM が返されます。

find_by_sqlActiveRecord が実行できないことについてのみ ActiveRecord をバイパスすることを意図しているため、最後の手段として使用するようにしてください。また、ActiveRecord がサポートしていないものであっても、SqueelまたはValium gem を使用してエッジ ケースを処理できるかどうかを常に確認できます。

使用しないもう 1 つの理由はfind_by_sql、たとえば、MySQL 固有の用語を使用すると、今後他のデータベースを使用できなくなることです。

于 2012-06-20T09:09:08.300 に答える