I'm not sure if this fixes the problem or not, but:

The :child_key is the child_key property, not the :child_key
property's field name.

Regards
Jon

On 20 April 2011 14:34, Israel Ben Guilherme Fonseca
<[email protected]> wrote:
> Hi everybody,
>
> I'm getting a problem with the many-to-many through relationship. I made the
> "normal" version and the "through" version, and I thought that I would get
> the same result, and thats not happening.
>
> Array.new Disciplina.all(Disciplina.professor_disciplinas.professor.id => 1
> )
>
> Array.new Disciplina.all(Disciplina.professores.id => 1 )
>
> These instructions should mean the same, and make the same (or almost) SQL.
>
> That's my code:
>
> #TABLES:
> #
> #disciplina
>
> #    id_disciplina,
> #    nome
>
> #professor
> #    id_professor
> #
> #professor_disciplina
>
> #    id_professor
> #    id_disciplina
>
> class Disciplina
>     include DataMapper::Resource
>
>     storage_names[:default] = "disciplina"
>
>     property :id,            Serial, :field => 'id_disciplina'
>
>     property :nome,          String
>
>     has n, :professor_disciplinas, 'ProfessorDisciplina', :child_key => [
> :id_disciplina ]
>
>     has n, :professores, 'Professor', :through => :professor_disciplinas,
> :via => :professor
>
> end
>
> class Professor
>     include DataMapper::Resource
>
>     storage_names[:default] = "professor"
>
>     property :id,            Serial, :field => 'id_professor'
>
>
>     has n, :professor_disciplinas, 'ProfessorDisciplina', :child_key => [
> :id_professor ]
>
>     has n, :disciplinas, :through => :professor_disciplinas
>
> end
>
> class ProfessorDisciplina
>         include DataMapper::Resource
>
>         storage_names[:default] = "professor_disciplina"
>         belongs_to :professor ,  'Professor' , :child_key => [ :id_professor
> ], :key => true
>
>         belongs_to :disciplina,  'Disciplina', :child_key => [
> :id_disciplina ], :key => true
>
> end
>
> # Nice SQL
> Array.new Disciplina.all(Disciplina.professor_disciplinas.professor.id => 1
> )
>
>
> # Bad SQL (database error and weird stuff)
> Array.new Disciplina.all(Disciplina.professores.id => 1 )
>
>
> The generated SQL for each instruction:
>
> -- Nice SQL
> SELECT "disciplina"."id_disciplina", "disciplina"."nome"
> FROM "disciplina"
> INNER JOIN "professor_disciplina" ON "disciplina"."id_disciplina" =
> "professor_disciplina"."id_disciplina"
> INNER JOIN "professor" ON "professor_disciplina"."id_professor" =
> "professor"."id_professor"
> WHERE "professor"."id_professor" = 1
> GROUP BY "disciplina"."id_disciplina", "disciplina"."nome" ORDER BY
> "disciplina"."id_disciplina"
>
>
> -- Bad SQL
> SELECT "disciplina"."id_disciplina", "disciplina"."nome"
> FROM "disciplina"
> INNER JOIN "professor_disciplina" ON "disciplina"."id_professor" =
> "professor_disciplina"."id_professor" -- should be disciplina.id_disciplina
> INNER JOIN "professor_disciplina" "professor_disciplina_1" ON
> "professor_disciplina"."id_disciplina" =
> "professor_disciplina_1"."id_disciplina" -- why another join?
> INNER JOIN "professor" ON "professor_disciplina_1"."id_professor" =
> "professor"."id_professor"
> WHERE "professor"."id_professor" = 1
> GROUP BY "disciplina"."id_disciplina", "disciplina"."nome"
> ORDER BY "disciplina"."id_disciplina"
>
> The bad SQL got a weird join and is using a wrong id.
>
> What am I doing wrong? I think that maybe it's something with the :via
> option.
>
> Thanks in advance,
>
> ------------------------------------------------------
> Syntax Highlighted version of the code:
>
> Ruby Code
> http://dpaste.com/533933/
>
> Generated SQL
> http://dpaste.com/533934/
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "DataMapper" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/datamapper?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"DataMapper" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/datamapper?hl=en.

Reply via email to