Pergunta

Eu tenho um relacionamento muitos-para-muitos como este: A organizações utilizador has_many através de afiliações e vice-versa.

Eu estou usando organizações declarativas e eu só quero que um usuário editar uma determinada organização se ele é filiado eo atributo affiliationtype de filiação é um valor particular.

Assim afiliações tem 3 colunas, user_id, organization_id e affiliationtype_id

posso fazer:

o = Organization.find(:first)
o.affiliatons[0].user and get the user

Agora, eu gostaria de fazer isso:

has_permission_on [:organizations], :to => :edit do
  if_attribute (...)
end

Isso if_attribute deve ver se o usuário atual é o organization.affiliation usuário [?]. E se o organization.affiliation [?]. Affiliationtype_id = "3"

Espero que esta é uma questão de sintaxe ... Eu realmente preciso para começar este trabalho.

Foi útil?

Solução

EDIT:

Você pode restringir o tipo de afiliação com intersects_with (& bloco) :

  has_permission_on [:organizations], :to => :edit do
    if_attribute :affiliations => intersects_with {
      user.affiliations.with_type_3
    }
  end

Por que não criar um named_scope para encontrar filiações cuja affiliationtype_id = 3?


De documentação declarative_authorization :

Para reduzir a redundância em blocos has_permission_on, uma regra pode depender de permissões em objetos associados:

authorization do
  role :branch_admin do
    has_permission_on :branches, :to => :manage do
      if_attribute :managers => contains {user}
    end

    has_permission_on :employees, :to => :manage do
      if_permitted_to :manage, :branch
      # instead of
      #if_attribute :branch => {:managers => contains {user}}
    end
  end
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top