0

最近、Railsアプリをバージョン3.0.3から3.1.0にアップグレードしました。アプリケーションは、1つの大きな例外を除いて、以前と同じようにほとんどの部分で正常に実行されます。2つのモデル、SurveyDatumとSubGroupの間には多対多の関係があり、SubGroupSurveyDatumというモデルを介して結合されています。それぞれのコードは次のとおりです。

class SurveyDatum < ActiveRecord::Base
  has_many :sub_group_survey_data
  has_many :sub_groups, :through => :sub_group_survey_data
end


class SubGroup < ActiveRecord::Base
  has_many :sub_group_survey_data
  has_many :survey_data, :through => :sub_group_survey_data
end

そしてあなたが期待するかもしれないように:

class SubGroupSurveyDatum < ActiveRecord::Base
  belongs_to :survey_datum
  belongs_to :sub_group
end

以前にデータベースから取得したSurveyDatumオブジェクト(「sd」と呼びます)があり、sub_groupsメソッド(sd.sub_groups)を呼び出すと、これはアクティブレコードによって生成された結果のSQLクエリです。

SELECT `sub_groups`.* FROM `sub_groups` INNER JOIN `sub_group_survey_data` ON `sub_groups`.`id` = `sub_group_survey_data`.`sub_group_id` WHERE `sub_group_survey_data`.`survey_datum_id` IS NULL

「ISNULL」の部分は、明らかに私の調査データオブジェクトのIDが入るはずの場所ですが、アクティブレコードはそれを使用できません。前述のように、オブジェクトは永続化されてデータベースから取得されたため、オブジェクトには実際にIDがあります。この問題は、Rails 3.1に移行して初めて発生したため、新しいバージョンでは適切に実行されていないことがあると思いますが、わかりません。何か案は?よろしくお願いします!

4

2 に答える 2

1

うーん、レール3.1.0を使用して複製しようとしましたが、すべてうまくいきました。id = nil唯一のケースは、データベースから取得したレコードを手動で設定した場合です。それから私は得ました:

SELECT "authors".* FROM "authors" INNER JOIN "relations" ON "authors"."id" = "relations"."author_id" WHERE "relations"."post_id" IS NULL

どのデータベースを使用していますか?私はsqlite3でこれを試していました。また、特定の宝石、特にActiveRecordで動作する宝石にも注意してください。私は過去にこれに問題を抱えていました。

于 2012-05-24T18:39:09.660 に答える
0

問題を発見しました。Survey_dataテーブルに複合主キーがあることを忘れていました。バージョン3.2.3にアップグレードし、SurveyDatumモデルに以下を追加した場合:

set_primary_key :id

クエリは最終的に構築され、適切に実行されました。

于 2012-05-25T13:44:08.280 に答える