2011-03-10 18 views
0

我剛剛意識到我的一個模型有object_id作爲一個列,這將導致prolems。object_id的另一個名字是什麼?

關於名稱object_id的可能替代方案的任何建議?

+1

嗯..「thinger」怎麼樣? – mrcrowl 2011-03-10 04:15:35

+0

請告訴我你沒有'class Object 2011-03-10 22:42:40

回答

0

您的模型中不需要使用object_id。數據庫中不應該有名爲object_id的列。

object_id只是一個默認方法,所有(Ruby 1.9中除BasicObject除外)對象都有(請參閱docs)。

返回obj的整數標識符。 對於給定對象 , 所有對id的調用都將返回相同的號碼,並且沒有兩個活動對象將共享 的id。 取代已棄用的Object#id

2.object_id # 5 or anything, but the same 
2.id # NoMethodError: undefined method `id' for 2:Fixnum 
2.object_id # 5 
"anything has object_id".object_id # 22522080 
"anything has object_id".object_id # 22447200 - string has different object_id because it's a new instance everytime 

所以,僅僅用id訪問的ActiveRecord類的數據庫標識符。這是由Ruby On Rails爲模型對象創建的。


OR,如果你確實需要有所謂的object_id,那麼你可以創建ActiveRecord的模型這樣的方法數據庫中列:

def general_id 
    read_attribute(:object_id) 
end 
3

這是什麼欄應該是映射到?它是一個外鍵到對象表嗎?

找出你真正想要代表什麼。這可能不是世界上任何一般的東西。 (如果是,也許東西是一個更好的名字。)

如果你在約束條件下工作,你絕對必須有一個object_id列,你仍然可以參考它直接與attributes[:object_id]和旁路的Rails的魔術方法。

作爲最後的手段,您可以用自己的#object_id方法覆蓋該方法,該方法僅從數據庫返回該屬性(這是Rails在#id方法中所做的)。我想不出任何會使絕對是我的頭頂的,但這可能不是一個好主意。對象ID用於很多雜項,所以如果你做對象比較,使用你的對象作爲散列鍵等,你可能會得到奇怪的行爲。

0

我有點驚訝Rails沒有創建__object_id__作爲object_id的原始形式的參考,如send具有稱爲__send__的Ruby變體。

編輯:紅寶石方法__id__似乎是等效爲object_id__send__。使用object_id作爲您的外鍵的方法可能是安全的,或者它可能不是。我目前的工作中並沒有使用Rails。

+1

'__send__'別名不是Rails的東西,它是Ruby的核心方法。它的RDoc甚至聲明:_「如果'send'與** obj中的現有方法發生衝突,則可以使用'__send__' **這是比原始發佈者在'object_id'上發生衝突更常見的情況 - 如果他想要的話,他可以輕易地做出這樣的別名。 – SFEley 2011-03-10 07:46:57

相關問題