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.id の代わりに、フィールド materias.codigo=datos_materia.materia_codigo で結合する必要があります (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

編集:この記事を書き直した後、マテリアとダトスマテリアの関係が間違っているという結論に達しました。belongs_to と has_many を後方に持っているようです。materias.codigo と datos_materia.id は両方とも主キーであると述べています。マテリアの主キーで結合したいということは、マテリアが多くの datos_materia を持つ必要があることを意味し、関連付けが定義されているため、その逆ではありません。

要するに、あなたの関連付けと問題の説明は、1対多の関係シップの片側の主キーを多側の外部キーとして保存しようとしていたようです。これは、リレーショナル データベースのしくみではありません。通常、1 対多の関係の多側では、関連付けられたレコードの主キーが外部キーとして格納されます。

翻訳でいくつかのものが失われているようです。だから、あなたの関係のどこが悪いのかについてのより良い説明があります.

Rails は、外部キーの名前が「#{foreign_class}_id」であると想定し、外部クラスに関連付けられた ID を格納します。外部キーは常に、belongs_to 側にあります。

質問で定義された関係。

DatosMateria またはそのインスタンスで呼び出されたすべての関連付けヘルパー メソッドは、 に参加しdatos_materia.id = materias.codigoます。

forig\n_key は materias.codigo であると予想されます。しかし、materias.codigo が主キーなので、マテリアを datos_materia にリンクするにはどうすればよいでしょうか?

@datos_materia.materias.create

Materia の codigo の列に格納された @datos_materia.id を使用して、新しい Materia レコードを作成します。逆にリレーションシップを確立すると、マテリアの codigo 列に @datos_materia.materia_codigo が格納された新しいマテリアが作成されます。

Materia.create(:datos_materia => @datos_materia)

マテリアまたはそのインスタンスで呼び出されたアソシエーション ヘルパー メソッドは結合しますdatos_materia.id = materias.materia_codgio

簡単な修正はありません。モデルを再定義し、テーブルを完全に作り直す必要があります。1 つのマテリアに多数の 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 に答える