1

私は 2 つのモデルを持っています。そのうちの 1 つはユーザーで、もう 1 つはコメントです。コメントはユーザーに属します。

class User < ActiveRecord::Base
    act_as_paranoid
    has_many :comments
end

class Comment < ActiveRecord::Base
    belongs_to :user
end

コントローラーで user.delete を実行すると、deleted_at 列が設定され、レコードが非表示になるという期待される結果が得られます。

私の問題は、ユーザーのコメントの関連付けが null に設定されていることです。したがって、サイトでは、コメントを所有しているユーザーは表示されません。ユーザーの名前が「なし」や「匿名」などではないことをコメントに表示したいと思います。

github https://github.com/goncalossilva/rails3_acts_as_paranoid/blob/rails3.2/lib/acts_as_paranoid/core.rbのソースを見る.

私の場合、削除時にユーザーアカウントを閉鎖したいだけです。クエリに表示されなくなったため、Authlogic はそれらを拒否し、ユーザー インデックス ページには表示されません。ただし、ユーザーが所有するものはすべて、ユーザーが引き続き所有できるようにします(ユーザーが戻ってくる可能性があるためなど)。

act_as_paranoid よりも良い方法はありますか?

4

1 に答える 1

0

次に、destroyメソッドをオーバーライドする問題に進みます。closed_atをタイムスタンプに設定するだけのcloseメソッドを作成しました。デフォルトのスコープを次のように設定した場合:

default_scope { where("closed_at IS NULL") }

その場合、モデルはUser.Allを含むどのクエリにも表示されません。スコープを削除して完全なクエリを取得できます。基本的に、これらのアイデアはact_as_paranoidから取得しましたが、はるかに単純化されています。問題は、コメントにuser_idが設定されていても、デフォルトのスコープが任意の関連付けロードで実行されることです。だから、言って

c = Comment.first
c.user

user_idが閉鎖されたアカウントの場合、nilが出力されます。私の場合、最も簡単な解決策は、デフォルトのスコープを削除し、Authlogic関数を次のように変更することでした。

def self.find_by_username_or_email(login)
  u = User.find(:first, :conditions => ["lower(username) = ?", login.downcase]) || User.find_by_email(login)
  return u unless u.closed_at  
end

この方法では、閉鎖されたアカウントはログインできません。ビューにユーザーをリストする場所では、hide_closedスコープを使用しました。

これが最良の最もエレガントなソリューションであったかどうかはわかりません。しかし、私の目的ではそれは機能します。

于 2013-01-21T13:16:13.937 に答える