0

私は自分の検索を作成するためにarelを使用してローカルでこの方法を作成しました。

def self.search(search)
    User.joins(:experience).where(Experience.arel_table[:description].matches("%#{search}%")
            .or(Experience.arel_table[:description].matches("%#{search.capitalize}%"))
            .or(Experience.arel_table[:job_title].matches("%#{search}%"))
            .or(Experience.arel_table[:job_title].matches("%#{search.capitalize}%")))
            .group(:user_id)
end

herokuへのプッシュまで、すべてがうまく機能します。

Heroku ログに次のメッセージが表示されます。

ActionView::Template::Error (PGError: ERROR:  column "users.id" must appear in the GROUP BY clause or be used in an aggregate function

これは選択です:

SELECT  "users".* FROM "users" INNER JOIN "experiences" ON "experiences"."user_id" = "users"."id" WHERE (((("experiences"."description" ILIKE '%rails%' OR "experiences"."description" ILIKE '%Rails%') OR "experiences"."job_title" ILIKE '%rails%') OR "experiences"."job_title" ILIKE '%Rails%')) GROUP BY user_id ORDER BY created_at DESC LIMIT 7 OFFSET 0):

ご覧のとおり、メソッドに .group(:user_id) があるため、このエラーがわかりません

よろしくお願いします。

アップデート

このようにメソッドを変更した後:

User.joins(:experience).where(Experience.arel_table[:description].matches("%#{search}%")
.or(Experience.arel_table[:description].matches("%#{search.capitalize}%"))
.or(Experience.arel_table[:job_title].matches("%#{search}%"))
.or(Experience.arel_table[:job_title].matches("%#{search.capitalize}%")))
.select("experiences.user_id, users.email")
.group("experiences.user_id, users.email")

私の見解ではこのエラーが発生します

undefined method `name' for nil:NilClass 

この行で

<%= user.information.name %>

この行を消去すると、このエラーが発生します

Routing Error

No route matches {:action=>"show", :controller=>"users", :id=>#<User email: "jgiron@hotmail.com">}
4

1 に答える 1

1

を行う必要がありますselect

User.joins(:experience).where(Experience.arel_table[:description].matches("%#{search}%")
        .or(Experience.arel_table[:description].matches("%#{search.capitalize}%"))
        .or(Experience.arel_table[:job_title].matches("%#{search}%"))
        .or(Experience.arel_table[:job_title].matches("%#{search.capitalize}%")))
        .select("experiences.user_id, users.email")
        .group("experiences.user_id, users.email")

選択する列を指定しない場合、Rails はデフォルトですべての列を選択しようとします。

アップデート

SQL クエリを実行する場合、 に表示されるすべてのフィールドが に表示されるSELECT必要がありGROUP BYます。したがって、 を持っている場合SELECT foo, bar, baz, MAX(id) FROM foo_bars GROUP BY foo, bar, bazfoobarおよびbazが にある必要がありますGROUP BY。は集約関数であるためMAX(id)、 に表示する必要はありませんGROUP BY

ただし、この種の を実行しようとしていない場合GROUP BY、Rails には と呼ばれるアプリケーション側のメソッドがありますgroup_by。次のように使用します。

@experiences.group_by {|x| x.user_id} 

これは、キーをユーザー ID、値をエクスペリエンスとして持つハッシュを返します。

于 2012-12-17T23:16:48.287 に答える