Find_by_permalink y una duda

Buenas,

Me acabo de encontrar con un pequeño problema con find_by_xxx…

En este caso tengo una tabla contents y una tabla content_translations,
pensadas para funcionar con globalize 2 por la cual cosa en la tabla
contents sólo tengo el campo id de cada “content” y en la tabla
content_translations tengo los campos title, permalink y body…

El tema es que quería hacer un Content.find_by_permalink pero parece que
no es posible, ya que el campo permalink está en la tabla
content_translations. Primero pensé en poner el campo permalik en la
tabla contents pero me gustaría poder traducir también el permalink para
asi tener las rutas en varios idiomas…

No se si es una animalada hacer esto o qué… y por eso recurro a
vuestros sabios consejos! :wink:

Si no lo véis muy descabellado… (qué se yo… quizás jugáis con el
routes.rb o sabéis otro sistema para tener las rutas en varios idiomas
que me pueda servir…) qué solución creis que es la mejor para
solucionar el problema con el find_by_x en un caso cómo este?

Un saludo y felices fiestas a todos!

david.

Yo no tengo ni idea de como se hace programando, ni si lo que te voy a
decir tiene sentido, pero mi logica me sugire que primero busques el
id de la noticia en content y luego este id se lo pases al
Content.find_by_permalink en las condiciones junto con el locale del
permalink que quieres

Igual es una chorrada, pero en mi cabeza me ha parecido buena idea.
Solo le tines que pasar dos parametros en las condiciones (id y
locale). Supongo que locale (:es, :en,…) sera un campo de tu tabla
content_translations. Repito, no he trabajado con Globalize

Un saludo

El día 31 de diciembre de 2008 12:45, David D.
[email protected]
escribió:> Buenas,

2008/12/31 David D. [email protected]

Lo primero es recordar que un find tiene como base SQL, así que sólo
tienes
que pensar en términos de esta. Si he entendido bien, lo que quieres
hacer
es un SELECT de content, con un left join con content_translations. Para
ello solo necesitas usar la opción :joins, combinada con :conditions y
otras
opcionales como :select, etc. Por lo demás utilizas el finder dinámico
como
siempre.

No parece nada descabellado, aunque si algo rebuscado no?

He hecho lo siguiente:

@traduccion = ContentTranslation.find(:first, :conditions => [“permalink
= ?”, params[:id]])

@content = Content.find(:first, :conditions => [“id = ?”,
@traduccio.content_id])

Para después llamar en la vista a @content.title, @content.body

Pero me parece algo rebuscado buscar directamente en la tabla
content_translations para obtener el id de “content” y después llamar en
la vista a @content.title que lo que hace es volver a buscar en la tabla
content_translations el campo “title” en la misma fila de la que saqué
el “permalink”.

¿Un lió no? Aunque funcionar, funciona… Gracias por la idea!

¿Alguna solución más “Dry”?.. :stuck_out_tongue:

Un saludo!

Muchas gracias, ya había pensado hacer algo así pero no tenía claro
cómo, me lo miraré con calma…

Lo que me extraña es que no lo tenga en cuenta Globalize 2.

Si puedes hacer un @content = Content.find(:id) y después en la vista
hacer un @content.title (que esta en la tabla content_translations)…
¿no debería poder hacer también un Content.find_by_x y que tuviera en
cuenta la tabla content_translations?

Un saludo!

Manuel González Noriega wrote:

2008/12/31 David D. [email protected]

Lo primero es recordar que un find tiene como base SQL, así que sólo
tienes
que pensar en términos de esta. Si he entendido bien, lo que quieres
hacer
es un SELECT de content, con un left join con content_translations. Para
ello solo necesitas usar la opción :joins, combinada con :conditions y
otras
opcionales como :select, etc. Por lo demás utilizas el finder dinámico
como
siempre.

ActiveRecord::Base

No parece nada descabellado, aunque si algo rebuscado no?

ya me imagino que no era la mejor opcion. haz caso a manuel que
entiende del tema :slight_smile:
Me alegro de que te haya aportado algo mi comentario. Una cosa, cuando
tengas claro como hacerlo, podrías poner tu solución definitiva en
este hilo, así me entero.

Gracias y feliz 2009 a todos

El día 31 de diciembre de 2008 13:18, David D.
[email protected]
escribió:> No parece nada descabellado, aunque si algo rebuscado no?

Buenas Manuel,

Gracias por tu respuesta pero, después de volver a consultar la
documentación y tal sigo perdiendome en algun lugar…

No puedo hacer un Joins en la consulta porque ya me falla antes de poder
hacer nada. Por ejemplo:

@content = Content.find_by_permalink(params[:id], :include =>
:content_translations)

Esto ya falla (undefined method find_by_permalink) porque permalink no
esta en la tabla “contents”, el :include no entiendo si querías que lo
hiciera aqui, pero ya no llega a usarlo porque el metodo lo necesita
antes…

Quizás me lio, pero ya te digo que me pierdo en algun sitio con este
tema…

Un saludo!

david.

2008/12/31 David D. [email protected]

Esto ya falla (undefined method find_by_permalink) porque permalink no
esta en la tabla “contents”, el :include no entiendo si querías que lo
hiciera aqui, pero ya no llega a usarlo porque el metodo lo necesita
antes…

Quizás me lio, pero ya te digo que me pierdo en algun sitio con este
tema…

Sí, no había caido en eso, los finders dinámicos se generan para cada
columna de la tabla del modelo. Lo que no entiendo es el empeño en usar
‘find_by …’ en vez de usar un find normal y meter la condición en
:conditions ¿tienes alguna razón en especial? :slight_smile:

2008/12/31 Manuel González Noriega [email protected]:

@content = Content.find_by_permalink(params[:id], :include =>

Sí, no había caido en eso, los finders dinámicos se generan para cada
columna de la tabla del modelo. Lo que no entiendo es el empeño en usar
‘find_by …’ en vez de usar un find normal y meter la condición en
:conditions ¿tienes alguna razón en especial? :slight_smile:

Y la solución parece ser “fat model”: escribe en tu modelo un método
find_by_permalink que invoque a find con los :include y los :condition
adecuados.

Suerte.