#2
Mar 06, 2007

Dynamic find_by Methods

Shorten simple finds considerably and improve readability by using the dynamic find_all_by and find_by methods.
Download (4.8 MB, 1:28)
alternative download for iPod & Apple TV (2.5 MB, 1:28)
# tasks_controller.rb
def incomplete
  @tasks = Task.find_all_by_complete(false)
end

def last_incomplete
  @task = Task.find_by_complete(false, :order => 'created_at DESC')
end

RSS Feed for Episode Comments 17 comments

1. Olivier Apr 29, 2007 at 08:55

hola


2. Vien May 02, 2007 at 11:37

wohoo, now i can shorten my code more, thx for the tip


3. Enrique Delgado May 07, 2007 at 12:14

Hi, I saw this railscast a while back and I've been meaning to ask something.

I like the dynamic find_by methods, but don't you lose the protection you get by the use of the question mark followed by variables?

Is "Task.find_all_complete(false)" less secure than "Task.find(:all, :conditions => ['complete = ?', false])" ? For example, if we were to plug a user-supplied value as the argument tot he dynamic find_by methods?


4. Ryan Bates May 07, 2007 at 15:01

@Enrique, good question. Thankfully Rails automatically quotes and escapes the input variable for the dynamic find by methods, so it is just as secure as using the full conditional statement with the question mark.


5. gd May 12, 2007 at 12:29

Ror is full of good things to help us on doing quick stuff


6. karl alexander Jun 11, 2007 at 13:55

Hi , This will be so usefull.Thank u so much.


7. Jonathan Jul 10, 2007 at 06:00

I wanted to reference the documentation because it took me quite a while to find this. http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001024

That's all about the with_scope method in ActiveRecord::Base. Hopefully someone else finds it useful for me to link it here.


8. Helena Dec 28, 2007 at 07:44

Hi,

Is there a way of using find_all_by type methods to replace conditions with wildcards in using LIKE or REGEXP?

Thanks very much for your help


9. Ryan Bates Jan 12, 2008 at 07:42

@Helena, you'll have to use a full find for that:

Task.find(:all, :conditions => ['name LIKE ?', name])

The shortcut find_by methods only work with equals comparison.


10. Samo Kralj Feb 27, 2008 at 08:45

Perhaps it would also be worth mentioning that you can combine conditions like this:
Task.find_all_by_complete_and_category_id(false, 1)


11. jc Dec 10, 2008 at 09:26

You can find more about this here: http://api.rubyonrails.org/classes/ActiveRecord/Base.html

Under "Dynamic attribute-based finders"


12. Bungee Bob Sep 25, 2009 at 02:32

What does the "False" do? Thanks.


13. elomarns Oct 10, 2009 at 20:38

Now it's possible to write an even better version of last_incomplete:

def last_incomplete
  @task = Task.find_last_by_complete(false)
end


14. skf bearing Jan 31, 2010 at 06:40

skf bearing


15. kamagra Mar 09, 2010 at 01:18

thanks for the share


16. m65 field jacket Mar 09, 2010 at 01:18

nice post


17. Louis Vuitton handbags Mar 09, 2010 at 19:25

railscasts.com/episodes/2-dynamic-find-by-methods

Add your comment:

(SKIP THIS ONE)

(required)

(not shown)


(use pastie or gist for code)

sponsored by:
if you want to help:
required:
Get Quicktime Player
Give Back to Open Source