0

現在、Rails 3+Deviseを使用しています。Time.nowをUser.deleted_atに設定して、ユーザーをソフト削除しています。

これにより、ユーザーが削除されます。次に、application_controllerで、ソフト削除されたユーザーを削除するかどうかを確認します。

  before_filter :no_deleted_users

  def no_deleted_users
    if current_user && current_user.deleted_at
      flash[:alert] = "Access Denied"
      return sign_out_and_redirect('/')
    end
  end

問題は、ソフト削除されたユーザーがまだ私のアプリ全体に表示されることです。私は次のようなモデルを持っています:

User (id, deleted_at)
GroupMember(id,user_id)
Comment(id,user_id)

soft_deletedユーザーがアプリに表示されないようにするにはどうすればよいですか?User.rbでこれを試してみました:

default_scope:conditions =>'users.deleted_at IS NULL'

しかし、group.group_membersのようなことをしたとき、そのスコープは効果がありませんでした。soft_deletedされたuser_idレコードを持つGroup_membersは引き続き返されました。

アプリでsoft_deletedユーザーの削除をエレガントに処理する方法に関する提案はありますか?

ありがとう

4

1 に答える 1

1

GroupMemberレコードは、Userのデフォルトスコープを認識しません。グループにグループメンバーを介して多くのユーザーがいることを指定した場合、group.usersは、ユーザーのデフォルトスコープを持つ既存のユーザーのみを返すことを期待します。group.group_membersが期待どおりに動作するには、グループをソフト削除されたユーザーに関連付けるレコードを削除するか、(Rails 3を想定して)GroupMemberに別のデフォルトスコープを維持する必要があります。

class GroupMember < ActiveRecord::Base
  belongs_to :user
  default_scope joins(:user).where('users.deleted_at IS NULL')

  # rest of the class
end
于 2012-09-23T02:53:03.387 に答える