我们最近将rails应用程序从3.0.3升级到3.1.0。应用程序大部分成功运行,就像之前一样,有一个主要的例外。我们在两个模型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
“IS NULL”部分显然是我的调查数据对象的id应该去的地方,但是活动记录无法使用它。该对象确实具有id,因为如上所述它是从数据库中持久化和检索的。这个问题在我们转移到rails 3.1之后才出现,所以我认为有些东西我没有按照新版本正确完成,但我不知道。有任何想法吗?提前感谢您的帮助!
答案 0 :(得分:1)
嗯,我使用了rails 3.1.0并尝试复制,但一切都很顺利。唯一的情况是我在从db检索到的记录上手动设置id = nil
。然后我得到了:
SELECT "authors".* FROM "authors" INNER JOIN "relations" ON "authors"."id" = "relations"."author_id" WHERE "relations"."post_id" IS NULL
您使用的数据库是什么?我正在尝试使用sqlite3。还要注意某些宝石,特别是那些与ActiveRecord配合使用的宝石。我过去遇到过麻烦。
答案 1 :(得分:0)
我们发现了这个问题。我忘记了survey_data表有一个复合主键。当我们升级到版本3.2.3,并在SurveyDatum模型中添加以下内容:
set_primary_key :id
查询最终构建并正确执行。