59 votes

Rails has_many avec des conditions dynamiques

Ce que je veux, c'est créer un modèle qui se connecte à un autre en utilisant une association has_many de manière dynamique, sans la clé étrangère comme celle-ci:

 has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota',
            :conditions => ["regra_fiscal = ?", ( lambda { return self.regra_fiscal } ) ]
 

Mais je reçois l'erreur:

 : SELECT * FROM "fis_faixa_aliquota" WHERE ("fis_faixa_aliquota".situacao_fiscal_id = 1
AND (regra_fiscal = E'--- !ruby/object:Proc {}'))
 

Est-ce possible?

110voto

Chirantan Points 6493
has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota',
        :conditions => ['regra_fiscal = #{self.regra_fiscal}']

Pas de. Ce n'est pas une erreur. Les conditions sont précisées dans des guillemets simples et contient encore le code #{self.regra_fiscal}. Lorsque les conditions de la clause est evaulated, le regra_fiscal méthode sera appelée sur l'objet de l' self (quelle que soit la classe). Mettre des guillemets doubles ne fonctionnera pas.

J'espère que c'est ce que vous cherchez.

Si vous êtes à l'aide de Rails 3.1+, vous aurez besoin d'utiliser un Proc objet:

:conditions => proc { "regra_fiscal = #{self.regra_fiscal}" }

65voto

Thomas Points 543

Rails 4 + manière:

 has_many :faixas_aliquotas, -> (object){ where("regra_fiscal = ?", object.regra_fiscal)}  :class_name => 'Fiscal::FaixaAliquota'
 

9voto

Chirantan Points 6493

Il existe un autre type de solution. Cependant, ce ne sera pas la portée par défaut.

 has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota' do 
  def filter(situacao_fiscal)
    find(:all, :conditions => {:regra_fiscal => situacao_fiscal.regra_fiscal})
  end
end
 

De cette façon, vous seriez capable de faire

 situacao_fiscal.faixas_aliquotas.filter(situacao_fiscal)
 

Je ne suis pas sûr que ce soit élégant et quelque chose qui résoudrait votre problème. Il y a peut-être de meilleures façons de le faire.

5voto

IgiX Points 3

Rails 4+ autrement:

 has_many :faixas_aliquotas, -> (object){ where(regra_fiscal: object.regra_fiscal) }, :class_name => 'Fiscal::FaixaAliquota'
 

3voto

Amala Points 1115

Dans Rails 3.1, il faut utiliser proc, Proc.new {"field = # {self.send (: other_field)}"}}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X