From 1c95b678573cc4ce72c40a5bbe35e6dfc376215f Mon Sep 17 00:00:00 2001 From: Derek Willis Date: Sun, 13 Jun 2010 22:35:16 -0400 Subject: updated active record querying guide to standardize on first_name for Client --- .../guides/source/active_record_querying.textile | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'railties/guides') diff --git a/railties/guides/source/active_record_querying.textile b/railties/guides/source/active_record_querying.textile index 6e7ff6d5e0..1b39f91eb1 100644 --- a/railties/guides/source/active_record_querying.textile +++ b/railties/guides/source/active_record_querying.textile @@ -103,7 +103,7 @@ h5. +first+ client = Client.first -=> # "Lifo"> +=> # "Lifo"> SQL equivalent of the above is: @@ -120,7 +120,7 @@ h5. +last+ client = Client.last -=> # "Russel"> +=> # "Russel"> SQL equivalent of the above is: @@ -140,7 +140,7 @@ h5. Using Multiple Primary Keys # Find the clients with primary keys 1 and 10. client = Client.find(1, 10) # Or even Client.find([1, 10]) -=> [# "Lifo">, # "Ryan">] +=> [# "Lifo">, # "Ryan">] SQL equivalent of the above is: @@ -227,7 +227,7 @@ h4. Pure String Conditions If you'd like to add conditions to your find, you could just specify them in there, just like +Client.where("orders_count = '2'")+. This will find all clients where the +orders_count+ field's value is 2. -WARNING: Building your own conditions as pure strings can leave you vulnerable to SQL injection exploits. For example, +Client.where("name LIKE '%#{params[:name]}%'")+ is not safe. See the next section for the preferred way to handle conditions using an array. +WARNING: Building your own conditions as pure strings can leave you vulnerable to SQL injection exploits. For example, +Client.where("first_name LIKE '%#{params[:first_name]}%'")+ is not safe. See the next section for the preferred way to handle conditions using an array. h4. Array Conditions @@ -544,7 +544,7 @@ In order to use optimistic locking, the table needs to have a column called +loc c1 = Client.find(1) c2 = Client.find(1) -c1.name = "Michael" +c1.first_name = "Michael" c1.save c2.name = "should fail" @@ -773,21 +773,21 @@ Even though Active Record lets you specify conditions on the eager loaded associ h3. Dynamic Finders -For every field (also known as an attribute) you define in your table, Active Record provides a finder method. If you have a field called +name+ on your +Client+ model for example, you get +find_by_name+ and +find_all_by_name+ for free from Active Record. If you have also have a +locked+ field on the +Client+ model, you also get +find_by_locked+ and +find_all_by_locked+. +For every field (also known as an attribute) you define in your table, Active Record provides a finder method. If you have a field called +first_name+ on your +Client+ model for example, you get +find_by_first_name+ and +find_all_by_first_name+ for free from Active Record. If you have also have a +locked+ field on the +Client+ model, you also get +find_by_locked+ and +find_all_by_locked+. You can do +find_last_by_*+ methods too which will find the last record matching your argument. You can specify an exclamation point (!) on the end of the dynamic finders to get them to raise an +ActiveRecord::RecordNotFound+ error if they do not return any records, like +Client.find_by_name!("Ryan")+ -If you want to find both by name and locked, you can chain these finders together by simply typing +and+ between the fields for example +Client.find_by_name_and_locked("Ryan", true)+. +If you want to find both by name and locked, you can chain these finders together by simply typing +and+ between the fields for example +Client.find_by_first_name_and_locked("Ryan", true)+. -There's another set of dynamic finders that let you find or create/initialize objects if they aren't found. These work in a similar fashion to the other finders and can be used like +find_or_create_by_name(params[:name])+. Using this will firstly perform a find and then create if the find returns +nil+. The SQL looks like this for +Client.find_or_create_by_name("Ryan")+: +There's another set of dynamic finders that let you find or create/initialize objects if they aren't found. These work in a similar fashion to the other finders and can be used like +find_or_create_by_first_name(params[:first_name])+. Using this will firstly perform a find and then create if the find returns +nil+. The SQL looks like this for +Client.find_or_create_by_first_name("Ryan")+: -SELECT * FROM clients WHERE (clients.name = 'Ryan') LIMIT 1 +SELECT * FROM clients WHERE (clients.first_name = 'Ryan') LIMIT 1 BEGIN -INSERT INTO clients (name, updated_at, created_at, orders_count, locked) +INSERT INTO clients (first_name, updated_at, created_at, orders_count, locked) VALUES('Ryan', '2008-09-28 15:39:12', '2008-09-28 15:39:12', 0, '0') COMMIT @@ -795,10 +795,10 @@ COMMIT +find_or_create+'s sibling, +find_or_initialize+, will find an object and if it does not exist will act similar to calling +new+ with the arguments you passed in. For example: -client = Client.find_or_initialize_by_name('Ryan') +client = Client.find_or_initialize_by_first_name('Ryan') -will either assign an existing client object with the name "Ryan" to the client local variable, or initialize a new object similar to calling +Client.new(:name => 'Ryan')+. From here, you can modify other fields in client by calling the attribute setters on it: +client.locked = true+ and when you want to write it to the database just call +save+ on it. +will either assign an existing client object with the name "Ryan" to the client local variable, or initialize a new object similar to calling +Client.new(:first_name => 'Ryan')+. From here, you can modify other fields in client by calling the attribute setters on it: +client.locked = true+ and when you want to write it to the database just call +save+ on it. h3. Finding by SQL -- cgit v1.2.3