0

我正在使用 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

4

1 回答 1

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 是主键,那么如何将一个 materia 链接到一个 datos_materia 呢?

@datos_materia.materias.create

将使用存储在 Materia 的 codigo 列中的 @datos_materia.id 创建一个新的 Materia 记录。反过来建立关系将使用存储在 materia 的 codigo 列中的 @datos_materia.materia_codigo 创建新的 materia。

Materia.create(:datos_materia => @datos_materia)

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

没有简单的解决方法。您将需要重新定义您的模型并彻底改造您的表格。假设您要设置一种材料有许多 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 将正常工作。

于 2009-11-16T21:03:56.833 回答