Forum: Ruby on Rails Trying to replace some .find calls with better code

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.
Tony T. (Guest)
on 2008-10-14 17:16
Hi all,

This forum has been very helpful in the past so I figured I'd try and
ask for some help on some (yet again) rather "newbie" stuff again.


I currently have the following DB Schema (Two Tables Listed here):

Users Table    (user has_many children)
-----------
id
login
...


Children Table (children belongs_to user)
--------------
id
first_name
last_name
is_lost (boolean)


Users Controller show method:

def show
  @user = User.find_by_login(params[:id])

  @lost_children = @user.children.find(:all, :conditions => "is_lost =
't'")

  ...
end


This WORKS. However, I'm sure I can cut down doing a find query by doing
something like this:

@lost_children = @user.children(:is_lost => true)


The above doesn't work for me (as I just made it up out of the blue).
But there must be something of this nature that can aid in avoiding
making another DB call. I've tried searching for a while now but have
had little luck.

At the very least, any suggestions on how to make that code
cleaner/better?


Many thanks in advance!

-Tony


P.S. Please let me know if you need more code or explanations.
Franz S. (Guest)
on 2008-10-14 17:34
(Received via mailing list)
How about looking into named_scope.

in your Child model:

named_scope :lost,
                     :conditions => "is_lost = 't'"

You can then do this:

@user = User.find_by_login(params[:id])
@lost_children = @user.children.lost

/franz
Franz S. (Guest)
on 2008-10-14 17:36
(Received via mailing list)
Forgot to mention that named_scope is native Rails 2.1 or
later.

If you're using an earlier version, you'll need to install the
has_finder plugin.
Roy P. (Guest)
on 2008-10-14 17:41
(Received via mailing list)
Try:

  @lost_children = @user.children.select {|c| c.is_lost}

-Roy
This topic is locked and can not be replied to.