2015-05-26 24 views
2

說我有一個派生自ActiveRecord的類。它有幾個字段,加上一個「id」字段。 「id」被創建,所以它的默認值是序列的「nextval」,所以每次保存新記錄時都會自動遞增。它是由做創建:如何更新Rails中的序列並獲取對象中的結果值?

CREATE SEQUENCE id_sequence;

ALTER TABLE my_table ALTER COLUMN id SET DEFAULT nextval('id_sequence');

所以,現在在Ruby中,我填充我的對象的字段,然後我 「救人!」它。現在我需要對對象做更多的工作,但「id」字段仍然設置爲零。 Ruby中沒有「load」函數可以讓我從數據庫中重新加載對象。儘管你會想到,「!」在ActiveRecord中並不意味着它會修改原始對象(如果Rails不遵循這些約定,那麼Ruby約定是什麼意思)。似乎你可以在原始對象內執行「self.find_by」。我認爲唯一能想到的就是在表格的某個定義消息字段上調用「find_by」(這幾乎不可能,因爲這是id的用途,但我沒有它!)並創建一個新對象,然後從中得到id。

必須有一些簡單的方法。

+0

所以你要說'save!'不會引發錯誤?什麼'保存'返回? – devkaoru

+0

我從來沒有聽說過「串行」欄目,它似乎並不像ActiveRecord的數據類型之一:http://stackoverflow.com/questions/17918117/rails-4-datatypes – Mike

+0

好像答案至今爲拯救「打完電話後重裝」‘用’,這是至少比我以前做黑客越好。 – Mike

回答

1

Rails的ActiveRecord的是應該被創建時,其新的ID自動更新的對象。這通常在序列和列同時被創建時正常工作,例如,使用SERIAL類型。僅僅將列的默認值設置爲nextval(sequence_name)不足以將序列「綁定」到列。

的解決辦法似乎是通過設置它的所有權,這樣的配列順序關聯:

ALTER SEQUENCE id_sequence OWNED BY my_table.id; 

這應該允許的ActiveRecord查詢PG目錄,並找到正確的序列值來檢索。

您可以通過之前和ALTER語句運行後SELECT pg_get_serial_sequence('my_table', 'id')檢查。在它可能是空白之前,並且在它應該顯示序列名稱後(在你的例子中爲id_sequence)。這是查詢ActiveRecord運行查找相應序列的名稱(line 258 in schema_statements.rb)

如果仍然不起作用,我會將序列重命名爲約定:tablename_columnname_seq - 所以my_table_id_seq在你的情況。

+1

其實我也有一個‘ALTER歸my_table.id SEQUENCE id_sequence’當我創建對象和「保存「我看着數據庫,我發現」id「被設置爲正確的數字,並且序列增加了,所以我知道事物的db端正在工作,但是當我查看對象時,id已設置是「無」。如果我再創建一個新的對象和「find_by」讓我剛剛創建的ID將被設置的對象,但是這是尷尬的,如果我可以使用一些其他識別領域。 – Mike

+0

加載對象只能@ Mike用SERIAL列創建一個新表格,看看是否可行。 –

+0

@ muistooshort他已經這麼做了。 –

相關問題