2016-09-28 1 views
1

現在、私は非常に基本的なドキュメント管理をカバーするアプリケーションを開発しています。 この間、質問が表示されました。ここでレールはデフォルト値でhas_manyを返しますActiveRecord

はシナリオです:

私は、ユーザーおよびドキュメント(ユーザーが多くのドキュメントをダウンロードすることができますし、文書が多くのユーザーによってダウンロードすることができます)のための古典的な多対多の関係を持っています。

このアプリケーションの中には、誰でもアクセスできる「公開文書」があります。

ここでの明らかな(そして素朴な)解決方法は、新規のユーザーごとにマッピングテーブルに「公開文書」を追加することです。しかし、これは本当に素朴ですし、これらの要素をマッピングテーブルに挿入するルーチンを書くことは望ましくありません。これは、データベースストレージも浪費します。

質問

はActiveRecordの中のユーザーのダウンロードの文書に(フラグ経由でマークされている)、これらの公文書を追加するためのRailsでの方法はありますか?

例:

ドキュメント

Id | Name | IsPublic 
------------------------------ 
1 | Test | false 
2 | Public | true 

ユーザー

Id | Name 
-------------------- 
1 | sternze 

ダウンロードドキュメント:

User_id | Doc_id 
---------------------- 
    1  |  1 

私が今できるようにしたいことは以下の通りです:

@user = User.find(1) 
@user.documents # --> now contains documents 1 & 2 
# I don't want to add rows to the documents inside the controller, because the data is dynamically loaded inside the views. 

私の団体は次のとおりです。

class User < ApplicationRecord 
    has_many :downloadable_documents 
    has_many :documents, through: :downloadable_documents 
end 

class DownloadableDocuments < ApplicationRecord 
    belongs_to :user 
    belongs_to :document 
end 

class Document < ApplicationRecord 
    has_many :downloadable_documents 
    has_many :users, through: :downloadable_documents 
end 

私は簡単な方法を見つけることができませんでした私が望むものを達成するために、しかし多分私は何かを見過ごした。

答えて

3

は 'all_documents'

class User 

    def all_documents 
    documents + Document.public 
    end 

end 

は、その後、あなたの反復の代わりに、documents

all_documentsを使用してユーザメソッドを作成する公文書

class Document 
    scope :public, -> {public?} 
end 

ための文書でスコープを作成します

関連する問題