Fork me on GitHub

Skip to content

ActiveRecord, a brief introduction – Part 2

Preguntas en ActiveRecord
3.0) ActiveRecord está conectado?

User.connected? # => true

3.1) Change

u = User.first
u.changed? # => false
u.first_name = "NewName" # => "NewName"
u.changed? # => true

3.1.2) ¿Qué cambió?

u.changed # => ["first_name"]

3.1.3) ¿Cuáles son los cambios?

u.changes # => {"first_name"=>["Enrique", "NewName"]}

3.2) ¿Cómo preguntar si guardamos los cambios?
No existe un método saved?, pero save nos devuelve true pudimos guardar en la base de datos y false si por alguna razón no pudimos guardar (en gral, no cumplimos con las validaciones).

>> u.first_name = "Elisa" # => "Elisa"
>> u.save
  SQL (0.1ms)   BEGIN
  User Update (0.4ms)   UPDATE `users` SET `first_name` = 'Elisa' WHERE `id` = 2
  SQL (35.8ms)   COMMIT
=> true

3.5) ¿Lo eliminamos?

u.last
u.destroyed? # => nil
u.destroy
  SQL (0.2ms)   BEGIN
  User Destroy (0.4ms)   DELETE FROM `users` WHERE `id` = 1
  SQL (54.4ms)   COMMIT
u.destroyed? # => true

3.6) Trabajando con nuevos elementos

>> u = User.new :first_name => "Antonia"
+------------+-----------+--------+
| first_name | last_name | email  |
+------------+-----------+--------+
| Antonia    |           |        |
+------------+-----------+--------+
1 row in set
>> u.attribute_present? :last_name
=> false
>> u.new_record?
=> true
>> u.save
  SQL (0.1ms)   BEGIN
  User Create (0.4ms)   INSERT INTO `users` (`last_name`, `first_name`, `email`) VALUES(NULL, 'Antonia', NULL)
  SQL (43.3ms)   COMMIT
=> true
>> u.new_record?
=> false

3.6) Existe ese atributo

>> u.has_attribute? :phone_number # => false

Este último punto no es muy utilizado, pero está bueno saber de su existencia.

Order
4.1) Especificar el orden en la consulta:

>> u = User.all :limit => 10, :order => 'last_name'
  User Load (64.3ms)   SELECT * FROM `users` ORDER BY last_name LIMIT 10
>> p = Post.all :order => "created_at DESC"
  Post Load (116.9ms)   SELECT * FROM `posts` ORDER BY created_at DESC
# OR Post.all :order => "created_at ASC"

4.2) Ordenes consecutivos (así se dice?)
Primero se ordena por fecha de creación y luego por título

>> p = Post.all :limit => 10, :order => "created_at DESC, title"
  Post Load (53.4ms)   SELECT * FROM `posts` ORDER BY created_at DESC, title LIMIT 10
>> u = User.all :order => ["first_name ASC, email DESC"]
  User Load (30.0ms)   SELECT * FROM `users` ORDER BY first_name ASC, email DESC

4.3) Orden por defecto:
En el modelo agregamos:

class User < ActiveRecord::Base
  default_scope :order => 'last_name, first_name'
end

4.4) Saltando el orden por defecto:

$ >> p = Post.all :with_exclusive_scope, :limit => 10
SELECT * FROM `posts` ORDER BY title LIMIT 10

Y todas nuestras consultas tendrán ese orden.

Categories: ActiveRecord, rails, Ruby.

Tags: , ,

Comment Feed

No Responses (yet)



Some HTML is OK

or, reply to this post via trackback.