#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 12 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)


12. 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"


13. visa drugstore Dec 30, 2008 at 05:09

low prices

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