Problemas con Has many through

1 view
Skip to first unread message

Paco Guzmán

unread,
Nov 18, 2009, 12:48:27 PM11/18/09
to Mundo Pepino
Hola lista,

Os presento mi caso para ver como lo haríais y para ver que estoy
haciendo mal. Teniendo la siguiente feature

gestion_de_blogs.feature

Escenario: Creando un blog
Dado que tenemos un usuario "fidel"
Y que dicho autor tiene un blog "titulo 1"

Bueno Ahora como están definidos los modelos

class User < ActiveRecord::Base
has_many :bloggerships, :dependent => :destroy
has_many :blogs, :through => :bloggerships
end

class Bloggership < ActiveRecord::Base
belongs_to :blog
belongs_to :user

validates_associated :user
validates_associated :blog
end

class Blog < ActiveRecord::Base
has_many :bloggerships, :dependent => :destroy
has_many :users, :through => :bloggerships
belongs_to :author, :class_name => "User", :foreign_key =>
"author_id"
end

Ahora los mapeo en para configurar mundo pepino

config.models_to_clean = [
Blog,
User
]

config.model_mappings = {
/^blogs?$/i => Blog,
/^usuari[ao]s?$/i => User,
/^autor(es)?$/i => User,
}

onfig.field_mappings = {
/^User::nombres?$/i => :login, # Si coloco User::name como sugiere
el README no funciona
/^Blog::nombres?$/i => :title,

/^descripcion(es)?$/i => :description,
/^titulos?$/i => :title,
/^autor(es)?$/i => :author
}

config.relation_model_mappings = {
/^author$/ => User
}

Vale la cuestión es que me genera correctamente el usuario, el
bloggership pero el blog no le asigna el id del usuario en el campo
author_id

Tenéis alguna idea de lo que puede estar pasando o si hay que usar
otros steps para esto

Un saludo

Raimond Garcia

unread,
Nov 18, 2009, 12:51:56 PM11/18/09
to mundo-...@googlegroups.com
Hola Paco!

Me da a mi que esta intentando guardarlo
con user_id en vez de author_id, no se
si Mundo Pepino tiene ya en cuenta
foreign keys diferentes al nombre de la tabla.

Nando?

Saludos!

Rai

2009/11/18 Paco Guzmán <pacog...@gmail.com>

Fernando García Samblas

unread,
Nov 18, 2009, 1:30:02 PM11/18/09
to mundo-...@googlegroups.com

Buenas!

Raimond Garcia escribió:


> Hola Paco!
>
> Me da a mi que esta intentando guardarlo
> con user_id en vez de author_id, no se
> si Mundo Pepino tiene ya en cuenta
> foreign keys diferentes al nombre de la tabla.
>
> Nando?

mmm, en principio debería de funcionar. En la app de MP tenemos el
modelo Lettuce:

class Lettuce < ActiveRecord::Base
belongs_to :orchard_of_birth, :class_name => 'Orchard'
end

La única diferencia con el author de Blog es que en este se declara
explícitamente :foreign_key (aunque yo creo que es el valor que va a
buscar rails por omisión).

Voy a echarle un ojo más a fondo y ahora os cuento...

>
> Saludos!
>
> Rai
>
> 2009/11/18 Paco Guzmán <pacog...@gmail.com

> <mailto:pacog...@gmail.com>>


--
Fernando García Samblas
fernand...@the-cocktail.com
http://nando.lacoctelera.com

The Cocktail
C/ Salamanca 17
28020 Madrid
+34 91 567 06 05

Fernando García Samblas

unread,
Nov 18, 2009, 1:58:38 PM11/18/09
to mundo-...@googlegroups.com
Fernando García Samblas escribió:

> Buenas!
>
> Raimond Garcia escribió:
>
>> Hola Paco!
>>
>> Me da a mi que esta intentando guardarlo
>> con user_id en vez de author_id, no se
>> si Mundo Pepino tiene ya en cuenta
>> foreign keys diferentes al nombre de la tabla.
>>
>> Nando?
>>
>
> mmm, en principio debería de funcionar. En la app de MP tenemos el
> modelo Lettuce:
>
> class Lettuce < ActiveRecord::Base
> belongs_to :orchard_of_birth, :class_name => 'Orchard'
> end
>
> La única diferencia con el author de Blog es que en este se declara
> explícitamente :foreign_key (aunque yo creo que es el valor que va a
> buscar rails por omisión).
>
> Voy a echarle un ojo más a fondo y ahora os cuento...
>

Creo que ya lo tengo. El test de la lechuga es así:

Dado que tenemos un huerto llamado "de secano"
Y que tenemos una lechuga "seca"
Y que dicha lechuga tiene como huerto de nacimiento "de secano"

"huerto de nacimiento" es el campo cuyo nombre no coincide con el modelo.

Según esto, el escenario de creación de Blog escrito de esta misma forma
debería funcionar:

Escenario: Creando un blog
Dado que tenemos un usuario "fidel"

Y que tenemos un blog "titulo 1"
Y dicho blog tiene como autor "fidel"

Paco, podrías probar este escenario?

Está claro que lo ideal es que funcione tanto de una forma como de la
otra. Ahora le creo una Issue en github.

Saludos,
nando

Paco Guzmán

unread,
Nov 18, 2009, 4:31:07 PM11/18/09
to Mundo Pepino
Hola Raimond!

Si parece que esta quiere utilizar el valor user_id pero no lo
encuentra en el modelo blog.

En cuanto a la utilización del mapeo de modelos:

onfig.field_mappings = {
/^User::name$/i => :login,
/^Blog::name$/i => :title,
}

Ya funciona con los últimos cambios de Nando

En cuanto al escenario que sugiere Nando:

Escenario: Creando un blog
Dado que tenemos un usuario "fidel"
Y que tenemos un blog "titulo 1"
Y dicho blog tiene como autor "fidel"

No encuentra el último step, sino que debo utilizarlo así, (¿Es
correcto Nando?)

Escenario: Creando un blog
Dado que tenemos un usuario "fidel"
Y que tenemos un blog "titulo 1"
Y que dicho blog tiene como autor "fidel"

Pero este step también falla ya que intenta seleccionar un autor por
título, está cogiendo el mapeo name del modelo mencionado -> /
^Blog::name$/ => :title como se muestra en la siguiente traza

SQLite3::SQLException: no such column: title: SELECT * FROM "users"
WHERE (title='fidel') LIMIT 1 (ActiveRecord::StatementInvalid)
./vendor/plugins/mundo-pepino/lib/mundo_pepino/base.rb:57:in
`find_or_create'
./vendor/plugins/mundo-pepino/lib/mundo_pepino/
resources_history.rb:82:in `add_resource'
./vendor/plugins/mundo-pepino/lib/mundo_pepino/
resources_history.rb:200:in `resources_array_field_and_values'
./vendor/plugins/mundo-pepino/lib/mundo_pepino/es_ES/
definitions.rb:31:in `/^que dich[oa]s? (.+) tienen? como (.+) ['"](.+)
["'](?:.+)?$/i'
caracteristicas/gestion_de_blogs.feature:64:in `Y que dicho blog
tiene como autor "fidel"'

Un saludo

On 18 nov, 19:58, Fernando García Samblas <fernando.gar...@the-
> >> 2009/11/18 Paco Guzmán <pacoguzm...@gmail.com
> >> <mailto:pacoguzm...@gmail.com>>
> fernando.gar...@the-cocktail.comhttp://nando.lacoctelera.com

nando

unread,
Nov 19, 2009, 9:01:31 AM11/19/09
to Mundo Pepino
On 18 nov, 22:31, Paco Guzmán <pacoguzm...@gmail.com> wrote:
> Hola Raimond!
>
> Si parece que esta quiere utilizar el valor user_id pero no lo
> encuentra en el modelo blog.
>
> En cuanto a la utilización del mapeo de modelos:
>
> onfig.field_mappings = {
>     /^User::name$/i => :login,
>     /^Blog::name$/i => :title,
>
> }
>
> Ya funciona con los últimos cambios de Nando


Pues te puedo asegurar que ha sido de chiripa :)

>
> En cuanto al escenario que sugiere Nando:
>
> Escenario: Creando un blog
>     Dado que tenemos un usuario "fidel"
>     Y que tenemos un blog "titulo 1"
>     Y dicho blog tiene como autor "fidel"
>
> No encuentra el último step, sino que debo utilizarlo así, (¿Es
> correcto Nando?)
>
> Escenario: Creando un blog
>     Dado que tenemos un usuario "fidel"
>     Y que tenemos un blog "titulo 1"
>     Y que dicho blog tiene como autor "fidel"

Totalmente cierto, me comí el "que" :(


>
> Pero este step también falla ya que intenta seleccionar un autor por
> título, está cogiendo el mapeo name del modelo mencionado -> /
> ^Blog::name$/ => :title como se muestra en la siguiente traza
>

Esto tiene toda la pinta de ser un bug. Me lo apunto en mi libreta
analógica ;)

Una pregunta Paco. Si el objetivo es que el author_id del blog guarde
el id de Fidel, entonces la relación :through => :bloggerships no
interviene en absoluto. no es así?

Tranks for the debugging!!!

nando

unread,
Nov 19, 2009, 2:49:28 PM11/19/09
to Mundo Pepino
On 18 nov, 22:31, Paco Guzmán <pacoguzm...@gmail.com> wrote:
> Escenario: Creando un blog
>     Dado que tenemos un usuario "fidel"
>     Y que tenemos un blog "titulo 1"
>     Y que dicho blog tiene como autor "fidel"
>
> Pero este step también falla ya que intenta seleccionar un autor por
> título, está cogiendo el mapeo name del modelo mencionado -> /
> ^Blog::name$/ => :title como se muestra en la siguiente traza


Fixed!!!

http://github.com/nando/mundo-pepino/commit/351131f49da51af7f8484e379cda2218600bee7c

Gracias Paco, imagino que ahora debería funcionarte correctamente.

Molaría que lo probases de nuevo por si aparece algún otro bug (espero
que no, pero por si acaso ;)

Saludos!
nando

Paco Guzmán

unread,
Nov 20, 2009, 7:05:47 AM11/20/09
to Mundo Pepino
Genial Nando!

El siguiente escenario rula perfectamente:

Escenario: Creando un blog en tres pasos
Dado que tenemos un usuario "fidel"
Y que tenemos un blog "titulo 1"
Y que dicho blog tiene como autor "fidel"
Entonces el blog "titulo 1" tiene en bbdd como autor "fidel"

Muchas gracias por el currele ;)

Por cierto el tema de la gestión de los mapeos de urls también me
solucionó otro problemilla que tenía, yo lo había arreglado de manera
super cutre :(. La historia era que debía tener más prioridad una ruta
del mapeo que por ejemplo la ruta de nuevo recurso. Vamos en lugar de
calzarle la ruta "new_blogs_path" yo quería "new_member_blogs_path" y
la añadía al url mapping para el string "la página de nuevo "blog"".
Pero tenía que modificar el código donde se invocaba al do_visit y
preguntar primero si existía el mapeo de la url que quería visitar.

Vamos que lo has dejado niquelao!!

Adiós

On 19 nov, 20:49, nando <fernando.garcia.samb...@gmail.com> wrote:
> On 18 nov, 22:31, Paco Guzmán <pacoguzm...@gmail.com> wrote:
>
> > Escenario: Creando un blog
> >     Dado que tenemos un usuario "fidel"
> >     Y que tenemos un blog "titulo 1"
> >     Y que dicho blog tiene como autor "fidel"
>
> > Pero este step también falla ya que intenta seleccionar un autor por
> > título, está cogiendo el mapeo name del modelo mencionado -> /
> > ^Blog::name$/ => :title como se muestra en la siguiente traza
>
> Fixed!!!
>
> http://github.com/nando/mundo-pepino/commit/351131f49da51af7f8484e379...
Reply all
Reply to author
Forward
0 new messages