Rails has_many avec des conditions dynamics

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 dynamic, sans la clé étrangère comme ceci:

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

Mais j’ai 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?

Rails 4+ way (Merci à Thomas qui a répondu ci-dessous):

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

Rails 3.1+ façon:

 has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota', :conditions => proc { "regra_fiscal = #{self.regra_fiscal}" } 

Rails 3 et ci-dessous:

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

Non, ce n’est pas une erreur. Les conditions sont spécifiées entre guillemets simples et contiennent toujours le code #{self.regra_fiscal} . Lorsque la clause conditions est formulée, la méthode regra_fiscal sera appelée sur l’object de self (quelle que soit la classe). Mettre des guillemets doubles ne fonctionnera pas.

J’espère que c’est ce que vous recherchez.

Rails 4 + façon:

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

Il y a un autre type de solution. Cependant, ce ne sera pas la scope 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.

Rails 4+ autrement:

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

Dans Rails 3.1, utilisez proc, Proc.new {“field = # {self.send (: other_field)}”}

Dans Rails 3.1, vous pouvez utiliser Proc.new pour vos conditions. comme indiqué par @Amala, mais au lieu de cela générer un hachage comme ceci:

 has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota', :conditions => {:regra_fiscal => Proc.new { {:regra_fiscal => self.regra_fiscal} } 

L’avantage de cette approche est que si vous faites object.faixas_aliquotas.build , le nouvel object créé aura automatiquement le même atsortingbut regra_fiscal que le parent.