2009-11-16 5 views
0

Je fais une somme en utilisant la fonction Somme fournie par des RubyOnRails Active Record comme suit:RoR: Comment faire pour modifier les champs de la déclaration d'inscription générée par la fonction somme de Active Record

s=DatosMateria.sum('inscritos',:conditions=> "datos_materia.ano=2005 AND materias.codigo=2394",:include=>"materias") 

retourne 0 et me génère l'instruction SQL suivante:

SELECT sum('datos_materia'.inscritos) AS sum_inscritos FROM 'datos_materia' LEFT OUTER JOIN 'materias' ON materias.codigo=datos_materia.id WHERE.. 

je besoin de se joindre sur les champs materias.codigo = datos_materia.materia_codigo au lieu de materias.codigo = datos_materia.id (materias.codigo et datos_materia.id sont les deux clés primaires et ils » ne sont pas du même type ni des clés associées.)

Les modèles concernés sont indiqués ci-dessous:


class DatosMateria < ActiveRecord::Base 
    set_table_name 'datos_materia' 
    has_many :materias,:foreign_key => 'codigo' 
end

class Materia < ActiveRecord::Base set_primary_key 'codigo' belongs_to :datosMateria, :foreign_key=> 'materia_codigo' end

Répondre

0

Edit: Après retravaillant ce post, je suis venu à la conclusion que votre relation entre Materia et DatosMateria ont tort. On dirait que vous avez appartient à et a beaucoup de retard. Vous mentionnez que materias.codigo et datos_materia.id sont les deux clés primaires. Que vous voulez vous inscrire sur la clé primaire materia implique que materia devrait avoir beaucoup de datos_materia, et non l'inverse puisque vos assocations sont définies. En bref: la description de vos associations et le problème, il semble que l'on essayait de sauvegarder la clé primaire d'un côté d'un un à plusieurs relation en tant que clé étrangère de tous les côtés. Ce n'est pas ainsi que fonctionnent les bases de données relationnelles. La façon dont ils vont habituellement est le côté de la relation un à plusieurs qui va stocker la clé primaire de l'enregistrement associé comme une clé étrangère.

Il semble que certaines choses se soient perdues en traduction. Alors, voici une meilleure explication de ce qui ne va pas dans vos relations. Rails s'attend à ce que les clés étrangères portent le nom "# {foreign_class} _id" et stocke la classe étrangère associée à l'ID. La clé étrangère se trouve toujours du côté belongs_to des choses.

Avec les relations définies dans la question.

Toutes les méthodes d'association d'association appelées sur DatosMateria ou une instance de celle-ci rejoindront le datos_materia.id = materias.codigo.

Lorsque la clé foreig doit être matériias.codigo. Mais materias.codigo la clé primaire, alors comment une materia peut-elle être liée à une datos_materia? Permet de créer un nouvel enregistrement Materia avec @ datos_materia.id stocké dans la colonne codigo de Materia. Où, en établissant la relation, l'inverse créera la nouvelle matière avec @ datos_materia.materia_codigo stockée dans la colonne codigo de la matière.

Materia.create(:datos_materia => @datos_materia) 

méthodes d'assistance Assocation appelés sur Materia ou une instance de celui-ci se joindront à datos_materia.id = materias.materia_codgio

Il n'y a pas de solution simple. Vous devrez redéfinir vos modèles et retravailler complètement vos tableaux. En supposant que vous cherchiez à mettre en place qu'une materia a beaucoup de datos_materia.Voici les relations définies correctement vous allez pour:

class DatosMateria < ActiveRecord::Base 
    set_table_name 'datos_materia' 
    belongs_to :materias, :foreign_key => :materia_codigo 
end 

class Materia < ActiveRecord::Base 
    has_many :datos_materias, :foreign_key => :materia_codigo 
end 

Cependant celui que vous avez défini votre relation correctement votre Somme fonctionnera comme il se doit.

+0

Merci pour votre réponse, le champ materia_codigo n'est pas la clé primaire mais le champ associé à 'codigo' dans mon modèle Materia. J'ai essayé votre réponse et n'a pas fonctionné pour moi. –

+0

J'ai passé en revue certains détails en raison de la langue utilisée. J'ai trouvé la racine de votre problème et mis à jour ma réponse. Mais ce ne sont pas de bonnes nouvelles. – EmFi

+0

Merci EmFi. Comme vous l'avez dit, j'ai eu l'association en arrière. J'ai réécrit les modèles comme vous l'avez mis avec quelques détails: belongs_to: materia sans le S, has_many: datosMaterias, et enfin, en ajoutant la set_primary_key 'codigo' dans Materia Model. Merci encore. –