Pergunta

Eu tenho dois modelos ActiveRecord com uma associação hasMany / belongsTo:

class User < ActiveRecord::Base
  has_many :letters
end

class Letter < ActiveRecord::Base
  belongs_to :user
end

O modelo de usuário tem um atributo revision_number, para o qual eu gostaria de abrangência da associação belongs_to, então a letra é associada a um usuário por ambos user.id e user.revision_number.

Eu tentei usar o: chave de condições, conforme documentado na documentação da API:

class Letter < ActiveRecord::Base
  belongs_to :user, :conditions => "revision_number = #{client_revision}"
end

mas esta tentativa de chamar cliente-revisão na classe Letter, não a instância de Carta. Poderia alguém me aponte na direção certa para definir o escopo da associação belongs_to corretamente?

Eu estou usando o age-as-revisable plug-in para a versão do Usuário modelo.

Foi útil?

Solução 2

Finalmente descobri o que eu precisava era algo como chaves compostas, que Rails ActiveRecord não suporta. A solução (pelo menos por agora) foi a acessores cliente write personalizados na Carta para apoiar as chaves compostas (id e revision_number):

class Letter < ActiveRecord::Base
  def client
    Client.find_by_id(self.client_id).try(:find_revision, self.client_revision)
  end

  def client=(c)
    self.client_id = c.id
    self.client_revision = c.revision_number
  end
end

class Client < ActiveRecord::Base
  acts_as_revisable

  has_many :letters
end

Com esta configuração, # 1.letters cliente irá recuperar uma matriz de letras, mas Letter # 2.client irá recuperar cliente # 1R2, enquanto Carta # 2.client irá recuperar cliente # 1r4:

Client         id:    1    1    1    1    1    1
       rev_number:    1    2    3    4    5    6

Letter         id:         1              2
        client_id:         1              1
  client_revision:         2              5

Ainda não tenho certeza se esta é a melhor abordagem para este problema, mas parece trabalho para agora.

Outras dicas

Estou tendo dificuldade em entender por que você iria querer âmbito do belongs_to desta forma. Corrija-me se eu estiver errado, mas pode ser melhor para fazer algo assim. Eu estou supondo que você quer algum tipo de sistema de controle de versão:

class User < ActiveRecord::Base
  has_many :letters
end

class Letter < ActiveRecord::Base
  has_many :revisions, :class_name => "LetterVersion"
  belongs_to :current, :class_name => "LetterVersion"
end

class LetterVersion < ActiveRecord::Base
  belongs_to :letter
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top