has_many:through - 使用NULL id的sql语句

时间:2012-05-24 17:40:32

标签: ruby-on-rails activerecord ruby-on-rails-3.1

我们最近将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之后才出现,所以我认为有些东西我没有按照新版本正确完成,但我不知道。有任何想法吗?提前感谢您的帮助!

2 个答案:

答案 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

查询最终构建并正确执行。