RoR:如何更改Active Record的sum函数生成的Join语句上的字段

时间:2009-11-16 20:11:34

标签: ruby-on-rails activerecord sum

我正在使用RubyOnRails的Active Record提供的Sum函数进行求和,如下所示:

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

它返回0并生成以下SQL语句:

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

我需要它来加入字段materias.codigo = datos_materia.materia_codigo而不是materias.codigo = datos_materia.id(materias.codigo和datos_materia.id都是主键,它们不是相同的类型,也不是相关的键。 )

所涉及的模型如下所示:

 
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

1 个答案:

答案 0 :(得分:0)

编辑:在重新编写这篇文章后,我得出结论,您的Materia和DatosMateria之间的关系是错误的。看起来你已经拥有了belongs_to和has_many。你提到materias.codigo和datos_materia.id都是主键。您希望加入materia主键意味着materia应该有许多datos_materia,而不是相反的定义关联。

简而言之:对你的关联和问题的描述,它看起来像是试图将一对一的主键保存到多个关系中作为多方的外键。这不是关系数据库的工作方式。他们通常采用的方式是一对多关系的许多方面将关联记录的主键存储为外键。

看起来翻译中丢失了一些东西。所以这里有一个更好的解释你的人际关系的错误。

Rails期望将外键命名为“#{foreign_class} _id”,并将存储与外部类相关联的id。外键总是在belongs_to方面找到。

使用问题中定义的关系。

在DatosMateria上调用的所有关联助手方法或其实例都将加入datos_materia.id = materias.codigo

foreig \ n_key应该是materias.codigo。但materias.codigo是主键,那么如何将材料链接到datos_materia?

@datos_materia.materias.create

将使用存储在Materia的codigo专栏中的@ datos_materia.id创建一个新的Materia记录。在建立关系的情况下,反过来会创建新的材料,并将@ datos_materia.materia_codigo存储在材料的codigo列中。

Materia.create(:datos_materia => @datos_materia)

在Materia或其实例上调用的关联助手方法将加入datos_materia.id = materias.materia_codgio

没有简单的解决方法。您需要重新定义模型并完全重新修改表格。假设您正在设置一个materia有许多datos_materia。以下是您正确定义的关系:

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

然而,你已经正确定义了你的关系,你的Sum将按预期工作。