Ruby on rails RoR:如何更改活动记录生成的Join语句上的字段';s和函数

Ruby on rails RoR:如何更改活动记录生成的Join语句上的字段';s和函数,ruby-on-rails,activerecord,sum,Ruby On Rails,Activerecord,Sum,我使用RubyOnRails的活动记录提供的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_mate

我使用RubyOnRails的活动记录提供的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..
我需要它加入materials.codigo=datos\u materiala.materiala\u codigo字段,而不是materials.codigo=datos\u materiala.id(materials.codigo和datos\u materiala.id都是主键,它们不是相同的类型,也不是关联键)

涉及的模型如下所示:


类DatosMaterial'codigo'
结束

类Material“Materiala\u codigo” 结束

编辑:修改完这篇文章后,我得出结论,Material和DatosMaterial之间的关系是错误的。看起来你已经有了属于你的东西,也有很多落后的东西。您提到materialas.codigo和datos_materiala.id都是主键。你想加入Material主键意味着Material应该有很多datos_Material,而不是你的Association定义的其他方式

简言之:关于您的关联和问题的描述,看起来我们试图将一对多关系的一侧的主键保存为多一侧的外键。这不是关系数据库的工作方式。它们通常的方式是一对多关系的多个方面将相关记录的主键存储为外键

在翻译过程中,似乎有一些东西丢失了。所以这里有一个更好的解释,来解释你们的关系到底出了什么问题

Rails希望外键被命名为“#{foreign_class}\u id”,并将存储与外部类关联的id。外键总是位于事物的“属于”一侧

根据问题中定义的关系

在DatosMaterial或其实例上调用的所有关联助手方法都将在
datos\u Materiala.id=materialas.codigo
上加入

其中,foreig\n\u键应为materialas.codigo。但是materialas.codigo是主键,那么如何将Material与datos_Material链接呢

@datos_materia.materias.create
将创建一个新的Material记录,其中@datos_materiala.id存储在Material的codigo列中。在建立关系时,另一种方法将创建新材料,其中@datos_materiala.materiala_codigo存储在材料的codigo列中

Materia.create(:datos_materia => @datos_materia)
Materiala上调用的Association helper方法或其实例将在
datos\u Materiala.id=Materialas.Materiala\u codgio上联接

没有简单的解决办法。您将需要重新定义模型,并完全返工表。假设您希望设置一种材质有许多datos_材质。以下是正确定义的关系:

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
类DatosMateriala:materiala\u codigo 结束 类Material:materia\U codigo 结束

无论您如何正确定义您的关系,您的总和都将正常工作。

感谢您的回复,Material_codigo字段不是主键,而是my Material模型中“codigo”的关联字段。我试过了你的答案,但不适合我。由于使用的语言,我掩盖了一些细节。我已经找到了你问题的根源并更新了我的答案。但这不是好消息,谢谢你。正如你所说的,我的联想是反向的。我重新编写了模型,就像你所说的那样,添加了一些细节:属于:Matria,没有S,有很多:DatosMaterials,最后,在Matria模型中添加了set\u主键“codigo”。再次感谢你。
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