2017-04-11 52 views
0

我有用戶創建的窗體。每個表單只對創作者可見。我想授予其他用戶查看特定表單的權限。有人可能會說我想將其他用戶列入白名單,以獲得特定的表單。Rails - 如何建模對象隱私設置和關聯

下面是我通過創建名爲「SharedForm」的第三個模型嘗試的。

應用程序/模型/ form.rb

Class Form < ApplicationRecord 
    belongs_to :user 
    ... 
end 

應用程序/模型/ user.rb

Class User < ApplicationRecord 
    has_many :forms 
    has_many :forms, through: :sharedforms 
    ... 
end 

應用程序/模型/ shared_form.rb

Class SharedForm < ApplicationRecord 
    belongs_to :user 
    belongs_to :form 
    ... 
end 

遷移

class CreateSharedForms < ActiveRecord::Migration[5.0]       
    def change                  
    create_table :shared_forms do |t|            
    t.integer :form_id, index: true            
    t.integer :user_id, index: true            
    t.timestamps                
    end                   
    add_foreign_key :shared_forms, :users, column: :user_id      
    add_foreign_key :shared_forms, :forms, column: :form_id      
    end                    
end  

爲了呈現與I定義的索引作爲用戶共享用戶二者的形式和形式:

應用程序/控制器/ forms_controller.rb

Class FormsController < ApplicationController 
    def index 
    @forms = Form.where(user_id: current_user.id) 
    shared = SharedForm.where(user_id: current_user.id) 
    @sharedforms = Form.where(id: shared) 
    end 
end 

這不起作用。

有沒有辦法通過user.forms和user.sharedforms分別訪問我需要的記錄?

回答

0

不能使用相同的名稱爲兩個關聯,因爲後者將覆蓋前者:

class User < ApplicationRecord 
    has_many :forms 
    # this overwrites the previous line! 
    has_many :forms, through: :sharedforms 
    ... 
end 

相反,你需要給每個關聯的唯一名稱:

class User < ApplicationRecord 
    has_many :forms 
    has_many :shared_forms 
    has_many :forms_shared_with_me, through: :shared_forms 
end 

注意has_manythrough選項應指向模型上的關聯!

這將讓你使用:

class FormsController < ApplicationController 
    def index 
    @forms = current_user.forms 
    @shared = current_user.forms_shared_with_me 
    end 
end 
+1

通常你一起使用角色(Rolify)與授權庫(CanCanCan或權威人士)來處理現實世界的應用。 – max

+0

你是老闆!這是完美的一個小調整,我不得不定義來源。 –

+1

「has_many:forms_shared_with_me,through::shared_forms,source :: form」 –