2012-08-17 33 views
0

我創建了一個與舊SQL數據庫通信的Rails應用程序,我需要設置primary_key。Rails 3.2.8 - 使用具有不同primary_key的遺留系統

Intially我這樣做:

class Post < ActiveRecord::Base 
    attr_accessible :body, :title, :incrementer_id 

    self.primary_key = "incrementer_id" 

    before_create :next_seq, on: :create 

    private 

    def next_seq 
    p = Post.last 
    self.incrementer_id = p.blank? ? 1 : (p.incrementer_id.to_i + 1) 
    end 

end 

我需要創建next_seq因爲Rails不自動增加 'incrementer_id'。

我必須進行三元化,因爲第一個項目的incrementer_id是零,並且它給出了錯誤。我很想避免每次都做這個檢查。

我不知道是否有一個最佳的方式來做next_seq。更好的是,使其與數據庫類型無關。

回答

2

首先,我不會指望Post.last方法爲您提供編號最高的項目。爲此,你會Post.maximum(:id)。在Ruby中,因爲&&與任何類型的值,而不僅僅是布爾的||工作,並作爲nil是falsey處理,你可以說...

self.incrementer_id = (Post.maximum(:id) || 0) + 1 

這樣做需要額外的往返於數據庫的每個保存並找到最大的現有ID可能不是非常有效。如果你寫了很多這些記錄,你可能會考慮在內存中使用一個ID池。爲此,您需要在另一個表中存儲下一個可用ID的行,並且在您的應用第一次需要新的ID時,將該值增加一個值,例如10或100,實際上保留了許多ID供您的ID使用應用實例。從該範圍分配ID值直到用完爲止,然後像以前一樣獲取新的ID池。

如果您使用的合併策略和數據庫被其他應用程序,通過添加1〜現有最大ID計算新的ID共享,可以使你的戰略,在從池中遞減順序分配的ID與兼容。

+0

謝謝史蒂夫。我想要最大的方法,因爲它可以防止最後一個不是最大數量的問題。 我想進行池化,但我不知道遺留系統是如何工作的。基本上我的應用程序和另一個應用程序將觸摸分貝,我不知道其他系統如何處理primary_key計數。 – 2012-08-17 17:31:37

相關問題