2013-01-18 18 views
4

數據庫有沒有辦法讓一行只允許一行(例如對於站點範圍的設置)?Rails ActiveRecord數據庫只有一行

+0

這不是一個數據庫,但是你可以用完成驗證類似。我不知道你爲什麼會。你期望*不小心插入額外的行嗎? – meagar

+0

不,我只是想,如果我有一個應該包含站點設置的數據庫,並且我希望它只有一行,這也應該反映在代碼中。當然,也許使用配置文件而不是數據庫會是一個好主意 - 我決定採用這種方法,因爲ActiveRecord處理所有事情的方式,我不需要存儲配置文件的路徑,打開/關閉文件,地址讀取/寫入權限問題等。 –

+1

如果您正在討論可在運行時配置的設置,那麼數據庫可能是適當的。但典型的Rails慣例是將配置存儲在'config /'目錄中,這就是它的用途。 – meagar

回答

5
class Whatever < ActiveRecord::Base 
    validates :there_can_only_be_one 

    private 

    def there_can_only_be_one 
    errors.add_to_base('There can only be one') if Whatever.count > 0 
    end 
end 
+0

附加說明:在Rails 3中,應該使用'.errors [:base] <<「Msg」'而不是'.add_to_base(「Msg」)'([link](http://apidock.com/rails/) ActiveRecord/Errors/add_to_base)) –

+2

如果有其他人想要使用它:這有一個新的Whatever在保存後無效,可以通過「||」修復它。 Whatever.first == self'在條件 –

2

這行中只有一列嗎?如果沒有,則通過遷移添加新列可能會過度。您至少可以讓該表包含「名稱」和「值」列,並通過名稱的唯一性進行驗證。

+0

是的,但它可能,但正如我的評論中所寫,我想要利用AR的優勢 - 並且我可以將所有列添加一個遷移,這不是我認爲的壞事。我不明白如何製作名稱值列我的問題 - 但Unixmonkey已經指出我的解決方案 –

3

在Rails 4:

class Anything < ActiveRecord::Base 
    before_create :only_one_row 

    private 
    def only_one_row 
    false if Anything.count > 0 
    end 
end 

無記載錯誤是壞的,然後

class Anything < ActiveRecord::Base 
    before_create :only_one_row 

    private 
    def only_one_row 
    raise "You can create only one row of this table" if Anything.count > 0 
    end 
end 
+0

對於其他誰來這裏,而不是'提高'使用以下內容: 'errors.add(:base,「如果Anything.count> 0',則只能創建該表的一行「) – rorykoehler

相關問題