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.
