Forum: Ruby on Rails dynamic condition for has_one and eager loading issue

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
05b76b92415862cc4783d09a9009641b?d=identicon&s=25 MrBanabas@googlemail.com (Guest)
on 2008-11-12 20:33
(Received via mailing list)
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:in `interpolate_sql'
    (eval):1:in `interpolate_sql'
    C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/
active_record/associations.rb:1600:in `association_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:in `association_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:in `collect'
    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:in `execute_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:in `catch'
    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:in `count'
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2008-11-12 23:07
(Received via mailing list)
On Nov 12, 7:32 pm, "MrBana...@googlemail.com"
<MrBana...@googlemail.com> 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
C64e63b70be7dfed8b0742540b8b27e5?d=identicon&s=25 Mark Reginald James (Guest)
on 2008-11-13 00:12
(Received via mailing list)
MrBanabas@googlemail.com 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/br...

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

--
Rails Wheels - Find Plugins, List & Sell Plugins -
http://railswheels.com
05b76b92415862cc4783d09a9009641b?d=identicon&s=25 MrBanabas@googlemail.com (Guest)
on 2008-11-14 15:10
(Received via mailing list)
What might happen in multithreaded mode??

--
Volker
C64e63b70be7dfed8b0742540b8b27e5?d=identicon&s=25 Mark Reginald James (Guest)
on 2008-11-15 02:21
(Received via mailing list)
MrBanabas@googlemail.com 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
05b76b92415862cc4783d09a9009641b?d=identicon&s=25 MrBanabas@googlemail.com (Guest)
on 2008-11-18 09:39
(Received via mailing list)
Wow,.... that sounds complicated. :-)

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
This topic is locked and can not be replied to.