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 ceci:
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?
has_many :faixas_aliquotas, -> (object) {
where("regra_fiscal = ?", object.regra_fiscal)
},
:class_name => 'Fiscal::FaixaAliquota'
has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota',
:conditions => proc { "regra_fiscal = #{self.regra_fiscal}" }
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 évaluée, la méthode regra_fiscal sera appelée sur l'objet 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 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 en mesure de faire
situacao_fiscal.faixas_aliquotas.filter(situacao_fiscal)
Je ne sais pas si c'est élégant et quelque chose qui résoudrait votre problème. Il peut y avoir de meilleures façons de procéder.
Rails 4 + d'une autre manière:
has_many :faixas_aliquotas, -> (object){ where(regra_fiscal: object.regra_fiscal) }, :class_name => 'Fiscal::FaixaAliquota'
Dans Rails 3.1 besoin d'utiliser 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 générez à la place 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
, l'objet nouvellement créé aura automatiquement le même regra_fiscal
attribut comme parent.