Rails - 如何建模对象隐私设置和关联

时间:2017-04-11 19:58:06

标签: ruby-on-rails activerecord

我有用户创建的表单。每个表单只对创建者可见。我想授权其他用户查看特定表单。可以说我想将其他用户列入特定表单的白名单。

这是我尝试创建第三个名为“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    

为了呈现与用户共享的用户表单和表单,我将索引定义为:

应用/控制器/ 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访问我需要的记录?

1 个答案:

答案 0 :(得分: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

请注意,through的{​​{1}}选项应指向模型上的关联!

这可以让你使用:

has_many