Obtener registros previos/siguientes con ActiveRecord

Posted: March 25th, 2009 | Author: FreedomCoder | Filed under: ActiveRecord, Open Source, Programming, Rails | Tags: , , , | Comments Off

Según se vaya avanzando en un proyecto, es posible que nos veamos en la necesidad de encotrar los registros vecinos para el que estemos utilizando en un momento dado. De este modo, por ejemplo si uno esta posicionado en un registro y desea obtener el siguiente, tener algo como “next” o “previous” sería muy útil.

Acts_as_ordered es un plugin interesante para obtener los registros previos o siguientes a uno determinado.Es muy versatil y potente. Se puede descargar de aquí.

Para mi cuestiones particulares, lo resolví a lo bestia, incluyendo estos dos métodos en la clase que los requería.

  1. def self.previous id
  2. prev_id= self.minimum(:id, :conditions => ['id > ?', id])
  3. self.find(prev_id)
  4. end
  5. def self.next id
  6. next_id=self.maximum(:id, :conditions => ['id < ?', id])
  7. self.find(next_id)
  8. end

Saludos

Inspirado de un reply en Duane’s Brain

leer más

(Via Rodolinux – Rodolinux’s Playground.) Original Link: Obtener registros previos/siguientes con ActiveRecord


Nested Forms rails 2.3

Posted: March 20th, 2009 | Author: FreedomCoder | Filed under: Programming, Rails | Tags: , | Comments Off

En el proyecto en el que estoy actualemente estamos usando Rails 2.3, uno de los motivos de usar rails 2.3 es que nos venía muy bien la nueva feature ‘Nested Forms’, resultaque estuve dando vueltas con algunos problemas hasta que finalmente los saque funcionando bien.

Les cuento yo tengo un formulario para crear un user, el modelo de user es el siguiente:

class User < ActiveRecord::Base
   has_one :person, :as => :personable, :dependent => :destroy
   accepts_nested_attributes_for :person
....
end

Es decir que un user tiene datos de contacto a travez de has_one :person (suena raro creo que se podría cambiar por has_one :contact_info, :class_name => ‘Person’) , y entonces el form era el siguiente:

<% form_for(:user, :url => users_path) do |f| -%>

<p><%= label_tag 'login' %><br/>
<%= f.text_field :login %></p>

<p><%= label_tag 'password' %><br/>
<%= f.password_field :password %></p>

<p><%= label_tag 'password_confirmation', 'Confirm Password' %><br/>
<%= f.password_field :password_confirmation %></p>

<% f.fields_for(:person) do |person_fields| %>
  <p><%= person_fields.label :email %><br/>
  <%= person_fields.text_field :email %></p>

  <p><%= person_fields.label :first_name, 'First Name:' %><br/>
  <%= person_fields.text_field :first_name %></p>
<% end %>

<p><%= submit_tag 'Create User' %></p>

<% end -%>

Resulta que esto no me funcionó y me daba el siguiente error:

ActiveRecord::AssociationTypeMismatch (Person(#-619527948) expected, got HashWithIndifferentAccess(#-607513158)):

El problema puntual era que no generaba bien el form y en vez de generar esto:

<input id='user_person_attributes_first_name'
  name='user[person_attributes][first_name]' 
  size='30' type='text' />

generaba esto:

<input id='user_person_first_name'
  name='user[person][first_name]' 
  size='30' type='text' />

Y entonces daba el error por que ActiveRecord (Nested model) genera un método person_attributes= en modelo dónde declaramos el accepts_nested_attributes_for (user en este caso) y por eso el form anterior no funciona como era de esperar.

En el controller tenía lo siguiente:

class UsersController < ApplicationController
  def new
    @user = User.new(:person => Person.new)
  end

  def create
    @user = User.new(params[:user])
    @user.save
  end
.....
end

La solución fue modificar el form y hacer así:

<% form_for @user do |f| -%>

<p><%= label_tag 'login' %><br/>
<%= f.text_field :login %></p>

<p><%= label_tag 'password' %><br/>
<%= f.password_field :password %></p>

<p><%= label_tag 'password_confirmation', 'Confirm Password' %><br/>
<%= f.password_field :password_confirmation %></p>

<% f.fields_for(:person) do |person_fields| %>
  <p><%= person_fields.label :email %><br/>
  <%= person_fields.text_field :email %></p>

  <p><%= person_fields.label :first_name, 'First Name:' %><br/>
  <%= person_fields.text_field :first_name %></p>
<% end %>

<p><%= submit_tag 'Create User' %></p>

<% end -%>

cambié el

<% form_for(:user, :url => users_path) do |f| -%>

por

<% form_for @user do |f| -%>

El form para editar un user quedó prácticamente igual y funciona con los attributes de person y todo sin hacer nada del lado del controller. Ahora la pregunta es: Esta bien que nested_forms solamente funcione con la forma?:

<% form_for @user do |f| -%> 

Si alguien tiene la respuesta que comente!

Saludos

(Via Gastón Ramos – Ruby, Rails….) Original Link: Nested Forms rails 2.3


Conferencia LocosXRails: falta poco!

Posted: March 20th, 2009 | Author: FreedomCoder | Filed under: Meeting / Conference, Rails | Tags: , | Comments Off

Estamos a poco mas de 20 días para el inicio de la primer conferencia de ruby y rails en Argentina. Todavía no te anotaste? Podes hacerlo mediante la web: http://www.locosxrails.com/registration

Si ya te anotaste, ‘spread the word’ mediante alguno de los siguientes badges:


Saludos!

(Via Emmanuel Oga’s Weblog.) Original Link: Conferencia LocosXRails: falta poco!


Usar fb_adaptor con versiones viejas de Interbase

Posted: March 20th, 2009 | Author: FreedomCoder | Filed under: ActiveRecord | Tags: , , | Comments Off

Como comenté en el update de post anterior respecto de como usar Firebird con JRuby , me era imposible insertar registros con sentencias sql, por lo que tuve que revisar otras opciones.

Intenté compilar el adaptador fb en JRuby sin éxito por tener dependencias nativas, por lo que decidí intentar con Ruby Enterprise Edition.

leer más

(Via Rodolinux – Rodolinux’s Playground.) Original Link:Usar fb_adaptor con versiones viejas de Interbase