2016-12-11 16 views
0

私はRails 5.0.0.1とカスタム認証/認可システム(Devise/CanCanに似ています)を使用しています。Rails、Models、 "Projects"スコープ

私はRailsアプリケーションに取り組んでおり、ユーザーが「グループ」または「プロジェクト」の一部であるかどうかに基づいてデータを表示/非表示する方法についていくつかのアドバイスを探しています。

アプリ:基本的に、ユーザーはテキスト記事の行をハイライト表示できます。それらは、最初に記事の内容(すなわち、その行のインデックス)のビューを提示される。彼らはハイライトする行を選択できます。行がハイライト表示されている場合、その行をクリックすると、その行のコメントセクションが表示されます。

Article has_many Lines 
Line has_many Highlights 
Highlight has_many Comments 
User has_many Highlights 
User has_many Comments 

Highlight belongs_to User 
Comments belongs_to Highlight 
Comments belongs_to User 

ここで「グループプロジェクト」機能を追加したいと思います。ユーザーがグループプロジェクトで使用する記事を選択します。他のユーザーをこのプロジェクトに招待します。招待されたユーザーはハイライトとコメントを付けることができますが、すべてのハイライトとコメントはそのプロジェクトのユーザーにのみ表示されます。

私の考えは、「スコープ」を作成することでした。デフォルトでは、すべての記事、ハイライト、およびコメントのスコープは 'public'です。どのユーザーもログインして、その記事、ハイライト、コメントを表示できます。しかし、ユーザーはグループプロジェクトの1つにアクセスし、「私的」スコープのハイライト、コメントなどを含む(おそらく同じ)記事を見ることもできます。これにより、1つのラインに複数のハイライトと異なるスコープのコメントを付けることができます。記事のラインのハイライト/コメントには、1つのパブリックバージョンと複数のプライベートバージョンがあります。

私の質問は、これらの複数のインスタンスを効率的に処理する方法です。プロジェクトごとにラインの新しいインスタンスを作成する必要がありますか?これはデータベースの不要な複製のようです。私はいくつかの条件をコントローラやモデルに入れてproject_idやそれに類するものに基づいてスコープに入れたいのですか?

「ユーザーグループ」を扱うための宝石が複数あることは知っていますが、通常は承認に使用されます。私は、ユーザーがそれぞれ独自の招待状とハイライトとコメントを持つ任意の数のプロジェクトを作成できるようにしたいと考えています。

+0

工夫のようなものにCommentモデルを更新認証フレームワークではありません。認証フレームワークであり、2つを混同しないでください。現在のユーザーに基づいてリソースの承認をしたいと思うように私に聞こえます。CanCanCanはこれを提供しています。あなたの認証システムと連携して動作します。 – David

+0

良い点。私は認証システムも持っています。私が望むのは、現在のユーザーだけではなく、ユーザーが属するプロジェクトに基づいた承認です。つまり、ユーザーがプロジェクトを見ている場合は、そのプロジェクトに関連する記事のハイライトとコメントをすべて表示します。 – RSH

答えて

0

あなたはhighlightscommentsテーブルとセットアップ団体にフィールドproject_idを追加する可能性があります。そして、

class User < ActiveRecord::Base 
    has_and_belongs_to_many :projects 
end 

class Project < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    has_many :highlights 
    has_many :comments 
end 

class Line < ActiveRecord::Base 
    has_many :comments 
    has_many :highlights 
end 

class Highlight < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :line 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :highlight 
    belongs_to :user 
    belongs_to :line 
end 

あなたは

によって

Highlight.all 

すべての公共ハイライトして、すべての(例えば)ハイライトにアクセスすることができます

Highlight.where(project: nil) 

すべてのハイライト

@line.highlights.where(project: @project) 

による特定@line@projectの。また、DBスペースを節約し、いくつかの柔軟性を提供するために、あなたはcommentsテーブルにbelongs_to_idbelongs_to_typeフィールドを追加することができ、

class Comment < ActiveRecord::Base 
    def self.belongs_to(types) 
    types.each do |type| 
     super type, foreign_key: "belongs_to_id" 
    end 
    validates_inclusion_of :belongs_to_type, in: types.map { |type| "#{type.capitalize}" } 
    end 

    belongs_to [:project, :highlight, :user, :line] 
end 

# didn't test 
+0

ありがとう、これは簡単に見えます。私はまた、 'User.first.projects'のような関連付けを使用するために、ProjectUser結合テーブルを作成する必要があります。 – RSH

+0

あなたは大歓迎です。正解ですが、関連する移行を探すことができます[ここ](https://stackoverflow.com/questions/6561330/rails-3-has-and-belongs-to-many-migration) –