ruby on rails - inverse_of - Rails has_many con condiciones dinámicas
rails references (6)
Lo que quiero es crear un modelo que se conecte con otro usando una asociación has_many de una manera dinámica, sin la clave foránea de esta manera:
has_many :faixas_aliquotas, :class_name => ''Fiscal::FaixaAliquota'',
:conditions => ["regra_fiscal = ?", ( lambda { return self.regra_fiscal } ) ]
Pero me sale el error:
: SELECT * FROM "fis_faixa_aliquota" WHERE ("fis_faixa_aliquota".situacao_fiscal_id = 1
AND (regra_fiscal = E''--- !ruby/object:Proc {}''))
es posible?
Rails 4+ way (Gracias a Thomas que respondió esto a continuación):
has_many :faixas_aliquotas, -> (object) {
where("regra_fiscal = ?", object.regra_fiscal)
},
:class_name => ''Fiscal::FaixaAliquota''
Carriles 3.1+ manera:
has_many :faixas_aliquotas, :class_name => ''Fiscal::FaixaAliquota'',
:conditions => proc { "regra_fiscal = #{self.regra_fiscal}" }
Carriles 3 y abajo:
has_many :faixas_aliquotas, :class_name => ''Fiscal::FaixaAliquota'',
:conditions => [''regra_fiscal = #{self.regra_fiscal}'']
No. Esto no es un error. Las condiciones se especifican en comillas simples y aún contiene el código #{self.regra_fiscal}
. Cuando se evalúa la cláusula de las condiciones, se llamará al método regra_fiscal sobre el objeto de self
(sea cual sea la clase). Poner comillas dobles no funcionará.
Espero que esto es lo que estás buscando.
En Rails 3.1 necesita usar proc, Proc.new {"field = # {self.send (: other_field)}"}
En Rails 3.1 puede usar Proc.new para sus condiciones. como dice @Amala, pero en su lugar genera un hash como este:
has_many :faixas_aliquotas, :class_name => ''Fiscal::FaixaAliquota'',
:conditions => {:regra_fiscal => Proc.new { {:regra_fiscal => self.regra_fiscal} }
El beneficio de este enfoque es que si hace object.faixas_aliquotas.build
, el objeto recién creado tendrá automáticamente el mismo atributo regra_fiscal
que el padre.
Hay otro tipo de solución. Sin embargo, este no será el alcance predeterminado.
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 esta manera usted podría hacer
situacao_fiscal.faixas_aliquotas.filter(situacao_fiscal)
No estoy seguro si esto es elegante y algo que resolvería su problema. Puede haber mejores formas de hacer esto.
Rails 4+ de otra manera:
has_many :faixas_aliquotas, -> (object){ where(regra_fiscal: object.regra_fiscal) }, :class_name => ''Fiscal::FaixaAliquota''
Rieles de 4 + vías:
has_many :faixas_aliquotas, -> (object){ where("regra_fiscal = ?", object.regra_fiscal)}, :class_name => ''Fiscal::FaixaAliquota''