0

私はdefault_scope、スコープがcurrent_user.company. サインアップ ページで client_side_validations gem を使用しています。これは、テナント セットがないことを意味します。

一意性バリデーターが@user.emaildefault_scope で実行されると、検証が適切に実行されなくなり ( company_idnil であるため)、常に一意の結果のように見えます。

私のユーザーモデル:

# user.rb
...
default_scope { where(company_id: Company.current_id) }
...

このクエリは、電子メールを検証するときに実行されます。

Started GET "/validators/uniqueness?case_sensitive=true& \
user%5Bemail%5D=me%2B40%40example.com&_=1423897339854" \
for 76.175.168.2 at 2015-02-14 07:02:30 +0000                        
  User Exists (0.4ms)  SELECT 1 AS one FROM "users" WHERE \
  "users"."company_id" IS NULL AND "users"."email" = 'me@example.com' LIMIT 1

ユーザー モデルからを削除するdefault_scopeと、正しい結果と適切な検証が得られます。

Started GET "/validators/uniqueness?case_sensitive=true& \
user%5Bemail%5D=me%2B40%40example.com&_=1423897339854" \
for 76.175.168.2 at 2015-02-14 07:02:30 +0000
  User Exists (0.4ms)  SELECT 1 AS one FROM "users" WHERE \
  "users"."email" = 'me@example.com' LIMIT 1

default_scopeこの gem が電子メールバリデーターを実行するときにオーバーライドする最も実用的な方法は何ですか?

4

3 に答える 3

1

一般に、このようなあらゆる種類の問題が発生するため、default_scope を使用しないでください。私の意見では、デフォルトのスコープで注文できます。

しかし、ここでは次のように解決できます。

class User < ActiveRecord::Base
 def self.default_scope
    #i don't know what company represents here
    where(company_id: Company.current_id) if Company.present?
 end
end

上記のように、デフォルトのスコープをクラス メソッドとして定義できます。

ドキュメントを参照してください: http://apidock.com/rails/ActiveRecord/Base/default_scope/class

于 2015-02-14T08:23:39.957 に答える
0

default_scope をオーバーライドするのは良い考えではないと思います。

ロジックをコントローラーに移動する必要があります。あなたが評論家を使っているかどうかはわかりません。スコープ機能を提供します。

そうでない場合は、このスコープをコントローラーに移動してみてください。

def current_users
   @users||= User.where(company_id: Company.current_id)
end
于 2015-02-14T08:16:18.273 に答える