が "編集可能"で他の多くのクラスが "編集可能"であるedit_privileges
と呼ばれるレールアプリケーションに関係テーブルがあります。これらのクラスのうちの2つがMessage
とComment
であるとします。Railsの多相関係テーブルクエリ - 複数のオブジェクトを検索
マイEditPrivilege
モデルは、次のコードを使用しています。ユーザーは、特定のモデルの編集権限を持っているかどうかを決定するために
belongs_to :editor, :class_name => "User"
belongs_to :editable, :polymorphic => true
そしてUser
、当然の
has_many :edit_privileges, :foreign_key => "editor_id"
を、私はできません
user.edit_privileges.find_by_editable_id(@message.id)
この場合、ユーザーha同じ編集者IDの編集権限を@message
とすると、そのテーブルから間違った編集権レコードを含む真を返します。
だから、私は、これらのオプションをやってみました:
user.edit_privileges.find(:all, :conditions => ["editable_id = ? AND editable_type ?", @message.id, @message.class.to_s])
user.edit_privileges.where(:editable_id => @message.id, :editable_type => @message.class.to_s)
右のレコードを見つけることで素晴らしい作品が、(何の編集権限がない場合は空の配列[]
)の代わりに、オブジェクトの配列を返します。 .destroy
を配列に渡すことができないので、編集権限を破棄するメソッドを作成しようとすると、これは特に問題になります。
上記の2つのソリューションに.first
を追加すると、最初のオブジェクトが返され、クエリの結果が空の場合はnil
が返されますが、それを行うには本当に最適な方法ですか?このようにすることに何か問題はありますか? (のような、代わりにfind_by_editabe_id_and_editable_type
のような動的な属性ベースのファインダーを使用しての)
[]は、ハッシュが、配列ではありません。配列のすべてのレコードを破棄する場合など、配列(コレクション)に対してバッチ処理を実行する場合は、 'users.map(&:destroy)'を使用できます。 –