2012-05-24 17 views
0

我們最近將我們的rails應用程序從版本3.0.3升級到3.1.0。應用程序在大部分情況下都能成功運行,就像之前的一個主要異常一樣。我們在兩個模型(SurveyDatum和SubGroup)之間建立了多對多的關係,並通過名爲SubGroupSurveyDatum的模型進行連接。下面是每個代碼:has_many:通過使用NULL的sql語句編號

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 

將「爲空」的部分顯然是在我的調查數據對象的ID應該去​​,然而活動記錄無法使用它。該對象確實有一個id,因爲如前所述,它是從數據庫中持久保存和檢索的。這個問題在我們轉向rails 3.1之後纔出現,所以我認爲我沒有按照新版本做適當的事情,但我不知道。有任何想法嗎?預先感謝您的幫助!

回答

0

我們發現了這個問題。我忘記了survey_data表有一個複合主鍵。當我們升級到版本3.2.3,並在SurveyDatum模型中添加以下內容:

set_primary_key :id 

查詢最終構建並正確執行。

1

嗯我用鋼軌3.1.0,並試圖複製,但一切都很好。唯一的情況是當我手動設置id = nil從db中檢索到的記錄上。然後我得到:

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

你使用了哪個數據庫?我正在嘗試這與sqlite3。還要注意某些寶石,特別是那些與ActiveRecord一起工作的寶石。我過去遇到過這個麻煩。

+0

我們使用的是MySql 5.5,雖然我沒有看到它和sqlite之間存在足夠大的差異,導致這類問題。不過,好的建議,謝謝,關於寶石。總是一個好主意來看待這些。該項目對外部依賴性非常輕,我們正在使用的唯一一個與數據庫相關的任何東西都是Devise進行身份驗證。搜索繼續! –