Pergunta

Eu tenho Labellings que pertencem a Emails e Labels.

Cada rotulagem deve ser exclusiva para o par de email/etiqueta - para que um email só possa ser rotulado como 'teste' uma vez.

Estou fazendo isso com validates_uniqueness_of :label_id, :scope => :email_id. Isso funciona como esperado.

Quando estou rotulando e -mails, quero adicionar a rotulagem, se for única e não faça nada se o email já estiver rotulado com esse rótulo.

Não quero duplicar a funcionalidade de validação em torno do meu aplicativo com algo como:

email.labels << label unless email.labels.include?(label)

É possível garantir que cada rotulagem tenha um par email_id/label_id sem precisar verificá -lo manualmente ou lidar com exceções?

Foi útil?

Solução

Eu não testei, mas você provavelmente pode substituir << No proxy da associação, algo como:

class Email < ActiveRecord::Base
  has_many :labelings
  has_many :labels, :through => :labelings do
    def <<(label)
      unless proxy_owner.labels.include?(label)
        proxy_owner.labelings << Labeling.new(:email => proxy_owner, :label => label)      
      end
    end
  end

end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top