On Aug 6, 3:03 am, M- Ryan <[email protected]> wrote:
> Unfortunately, declaring my scope with the "scope" method instead of a
> regular method returning an ActiveRecord::Relation doesn't solve my
> problem. (it also creates a new one since "2.days.ago" is only evaluated
> when the app loads the classes and not every time the method is called)
He made a mistake. It should be:
scope :recent, lambda { where ["published_at >= ?", 2.days.ago] }
> I think the includes method should support relations as well as
> associations (since associations/scopes/relations are so well integrated
> with eachother in rails 3).
> That way the following :
>
> @articles = Article.includes(:comments => :recent)
Ok, I see. You want to scope the eager-loaded objects. I guess this is
a case where Datamapper's identity map comes in handy.
I haven't tried this yet, but you might be able to put add scopes to
the association itself.
has_many :recent_comments, :class_name => "Comment", :conditions
=> ...
Hm, though that won't do the lazy eval. I checked the code for
has_many. The finder_sql is constructed the old way, not Arel all the
way down.
The compromise I can think of is to extend the collection code so it
loads all the comments in one batch and insert them into your
articles. The other one I can think of is to use AJAX to load the
recent comments and have a dedicated controller handle that. It's
probably a better design than trying to load a set of articles and
recent comments for all of them, in a single go, then rendering them
to the page.
Ho-Sheng Hsiao
http://ruby-lambda.blogspot.com
--
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.