Reputation: 8572
What I want is to create a Model that connects with another using a has_many association in a dynamic way, without the foreign key like this:
has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota',
:conditions => ["regra_fiscal = ?", ( lambda { return self.regra_fiscal } ) ]
But I get the error:
: SELECT * FROM "fis_faixa_aliquota" WHERE ("fis_faixa_aliquota".situacao_fiscal_id = 1
AND (regra_fiscal = E'--- !ruby/object:Proc {}'))
Is this possible?
Upvotes: 59
Views: 65610
Reputation: 1956
Rails 4+ way:
has_many :faixas_aliquotas,
-> (object){ where("regra_fiscal = ?", object.regra_fiscal)},
:class_name => 'Fiscal::FaixaAliquota'
Upvotes: 65
Reputation: 15664
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}']
No. This is not a mistake. The conditions are specified in single quotes and still contains the code #{self.regra_fiscal}
. When the conditions clause is evaulated, the regra_fiscal method will be called on the object of self
(whatever the class is). Putting double quotes will not work.
I hope this is what you are looking for.
Upvotes: 110
Reputation: 288
Rails 4+ another way:
has_many :faixas_aliquotas, -> (object){ where(regra_fiscal: object.regra_fiscal) }, :class_name => 'Fiscal::FaixaAliquota'
Upvotes: 5
Reputation: 158
In Rails 3.1 you can use Proc.new for your conditions. as stated by @Amala, but instead generate a hash like this:
has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota',
:conditions => {:regra_fiscal => Proc.new { {:regra_fiscal => self.regra_fiscal} }
The benefit of this approach is that if you do object.faixas_aliquotas.build
, the newly created object will automatically have the same regra_fiscal
attribute as the parent.
Upvotes: 1
Reputation: 1748
In Rails 3.1 need to use proc, Proc.new { "field = #{self.send(:other_field)}" }
Upvotes: 3
Reputation: 15664
There is another kind of solution. However, this wont be the default scope.
has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota' do
def filter(situacao_fiscal)
find(:all, :conditions => {:regra_fiscal => situacao_fiscal.regra_fiscal})
end
end
This way you would be able to do
situacao_fiscal.faixas_aliquotas.filter(situacao_fiscal)
I am not sure if this is elegant and something that would solve your problem. There may be better ways of doing this.
Upvotes: 9