viernes, 25 de octubre de 2013

Rails, default_scope y readonly

Desde que empece a usar rails me sorprendió la facilidad de configuración, prácticamente cada cosa que quieras hacer es posible con alguna funcionalidad existente, sin embargo a veces una configuración puede darte algunos dolores de cabeza, por ejemplo, digamos que tengo una tabla/objeto clientes y otro que depende de ella a la cual le queremos agregar una condición que necesita referenciar a la otra tabla:

class AccountClient < ActiveRecord::Base
  default_scope joins(:account).where('accounts.deleted=?',0).
  belongs_to :account
end

Y todo funcionaba aparentemente perfecto, sin embargo fue hasta la hora de subir a producción que se intentó insertar algún registro y apareció el siguiente error:

ActiveRecord::ReadOnlyRecord (ActiveRecord::ReadOnlyRecord)

Después de navegar un rato por la red resulta que cuando realizas un default_scope que tiene un join se activa por default el readonly y por lo tanto hay que desactivarlo de la siguiente manera:

  default_scope joins(:account).where('accounts.deleted=?',0).readonly(false)

Ahora, yo estoy utilizando rails 3.2.3 y 3.2.6, en algún sitio leí que readonly tiene un bug en la versión 4 así que hay que tener cuidado a la hora de migrar. Sigo buscando otras formas de corregirlo.

No hay comentarios:

Publicar un comentario