Dynamic condition for has_one and eager loading issue


#1

Hi,

I ve defined the following relation in one of my models with a dynamic
where condition:
has_one :selection,
:foreign_key => ‘object_id’,
:conditions => ‘selection_type = 1 and account_id = #
{self.send(:account_id)}’

That works perfect, however when I try to eager load that relation I
am getting the following error when doing a count. Seems that self is
not really my model class anymore… Does anybody know how I can get
that up and running?

Thanks a lot in advance

NoMethodError (undefined method account_id' for #<ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation: 0x4d5bf5c>): C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/associations.rb:1621:ininterpolate_sql’
(eval):1:in interpolate_sql' C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/associations.rb:1600:inassociation_join’
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/
active_record/associations.rb:1599:in each' C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/associations.rb:1599:inassociation_join’
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/
active_record/calculations.rb:184:in construct_calculation_sql' C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/calculations.rb:184:incollect’
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/
active_record/calculations.rb:184:in construct_calculation_sql' C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/calculations.rb:212:inexecute_simple_calculation’
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/
active_record/calculations.rb:121:in calculate' C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/calculations.rb:117:incatch’
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/
active_record/calculations.rb:117:in calculate' C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/calculations.rb:45:incount’


#2

On Nov 12, 7:32 pm, “removed_email_address@domain.invalid”
removed_email_address@domain.invalid wrote:

am getting the following error when doing a count. Seems that self is
not really my model class anymore… Does anybody know how I can get
that up and running?

When you do a ‘normal’ load the conditions are interpolated in the
context of the appropriate instance, but when you do an eager load
that can’t happen (because the object is not loaded yet (so account_id
is not known) or because you are loading multiple record) so the
conditions are evaluated in the context of the class. You just can’t
eager load stuff with that sort of interpolated condition, although I
suppose you might be able to put together a separate association,
purely for eager loading, where the conditions would become account_id
= parent_objects.account_id.

Fred


#3

removed_email_address@domain.invalid wrote:

am getting the following error when doing a count. Seems that self is
not really my model class anymore… Does anybody know how I can get
that up and running?

http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/7f7f715d917b9faa/426c768dd282929f

But be careful if and when you use Rails in multi-threaded mode.


Rails Wheels - Find Plugins, List & Sell Plugins -
http://railswheels.com


#4

removed_email_address@domain.invalid wrote:

What might happen in multithreaded mode??

Any dynamic change to the conditions of an association
would be common to all Rails handlers associated with that
process. Prior to Rails 2.2, this is was always one, so
there was no problem. But if you use Rails in multi-threaded
mode, one thread could change the conditions used by another
thread before those conditions are built into a DB query.

So you’d either have to put an exclusive lock around
that query (which may have a significant impact on the
database parallelism), or rewrite the AR code to fork
a thread-private condition whenever one is dynamically
set.


Rails Wheels - Find Plugins, List & Sell Plugins -
http://railswheels.com


#5

What might happen in multithreaded mode??


Volker


#6

Wow,… that sounds complicated. :slight_smile:

However, I m really interested in this topic.
Maybe you can explain me the proposed “rails way” to accomplish for
example a relation which depends on the currently logged in user (just
as an example)…

Thanks a lot in advance…
Volker