質問: railsであるレコードのある要素をワイルドカードとして認識させる方法かもしくは、それに似た内容の実装方法はありますか? 投稿した記事を示すpostモデルがあります。postには書き込んだ著者やタイトル、本文が入っています。 postモデルは1対多の関係でhas_many :collaborations(コラボレーション)を持っています。 collaborationモデルにはpost_idとuser_idが入っており、そのポストを誰と共有して共同作業で編集や投稿作業を行うかを示します。 例えばpost A はuser Aによって書かれたポストであり、そこにcollaborationがひとつ入っており、collaborationのuserにはuser Bが登録されているとUser Bもpost Aに書き込む権利を持ちます。 cancanのabilityクラスに以下の記述をしました。 ``` can :manage, Post do |post| Collaboration.find_by(user: user, post: post).present? end ``` ここまでは実装できているようです。 さらに追加でワイルドカード・コラボレーションを入れたいと考えています。あるポストにワイルドカード・コラボレーションが登録されると全てのユーザに共同編集の権利があることになります。 上記のコードでfind_byした歳にuserには「全ユーザに適用!」となって欲しいのですが、どのように実装すればいいのでしょうか? collaborationのサブクラスを作ってみようか、、、などと考えましたがなにか釈然としません。どなたかお知恵を貸してください!
回答: cancanについて、あまり詳しくありませんが、`user_id==nil`となっているcollaborationを「全ユーザに対するcollaboration」と定義すれば、 ``` can :manage, Post do |post| Collaboration.find_by(user: [user, nil], post: post).present? end ``` で、上手くいくんじゃないでしょうか?