рельсы канцканская ассоциация каскад - PullRequest
0 голосов
/ 15 октября 2018

Я использую стандартный класс User / devise.Более того, есть классы A, B и C и ассоциации:

Class User < ApplicationRecord
   has_many :As, dependent: :destroy

   devise :database_authenticatable, :registerable,
          :recoverable, :rememberable, :trackable, :validatable,
          :confirmable, :lockable
end
Class A < ApplicationRecord
   belongs_to :user  # foreign key => user_id
   has_many :Bs, dependent: :destroy 
end   
Class B < ApplicationRecord
    belongs_to :A    # foreign key => a_id
    has_many :Cs, dependent: :destroy
end
Class C  < ApplicationRecord                                    
   belongs_to :B       # foreign key => b_id
end

Что касается cancancan ,ility.rb, существует файл

app / models /ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user
    can :manage, A,  user_id:   user.id
    can :manage, B,        A:   { user_id: user.id }
    can :manage, C,  # ... ?????? <= this is my question point
  end
end

Контроллеры:

Class AController < ApplicationController
  load_and_authorize_resource
  def index
  end
end

Class BController < ApplicationController
  load_and_authorize_resource
  def index
  end
end

Class CController < ApplicationController
  load_and_authorize_resource
  def index
  end
end

(load_and_authorize_resource standard cancancan)

Пока все хорошо, если пользователь вызывает A, индекс показывает только записи пользователя A.Если пользователь звонит по B, в индексе показываются только записи пользователей B.

Мой вопрос: я не могу понять, как объявить строку able.rb относительно записей класса C, чтобы ограничить доступ пользователей к классу C, чтобысписок записей класса C (на которые ссылается B (на которые ссылается A (принадлежит пользователю))) только.

Заранее спасибо за помощь, Гарри

...