回答
Rails已經attr_accessor_with_default所以你可以寫
class Like
attr_accessor_with_default :politics,false
end
i = Like.new
i.politics #=> false
和多數民衆全部
UPDATE
attr_accessor_with_default已經對Rails 3.2被棄用..你可以用純Ruby
class Like
attr_writer :politics
def politics
@politics || false
end
end
i = Like.new
i.politics #=> false
這不是在attr_accessor中完成的,而是在您的遷移中完成的。
所以..你可以執行遷移
(1)rails g migration ChangePoliticsColumnToDefaultValueFalse
(2)添加這def self.up
def self.up change_column :your_table, :politics, :boolean, :default => 0 end
的底線是,默認的屬性設置中遷移。
希望這會有所幫助!
編輯:
有一些類似的問題也已經回答得很好:
實際上'attr_accessor'是正確的方法,如果你不希望你的屬性存儲在數據庫中。 –
如果你定義attr_accessor,在默認情況下做到這一點,而不是值nil
。你可以寫,從而!nil
我一直在使用這種形式的ActiveRecord:
class Song < ActiveRecord::Base
def initialize(*args)
super(*args)
return unless self.new_record?
self.play_count ||= 0
end
end
你不應該在ActiveRecord對象中重載初始化,而應該使用before_create。 – tesserakt
爲什麼不呢?初始化程序僅在從數據庫讀取對象時跳過。對於默認值,您不希望它覆蓋來自db的信息。 – mcmoyer
@ user1144360因爲[Rails AR指導性說明](http://guides.rubyonrails.org/active_record_validations_callbacks.html#after_initialize-and-after_find)有一個專門提供的'after_initialize',以避免需要重寫'initialize'。海事組織從長遠來看這樣做更安全。問題在於AR可能會從你下面改變並改變行爲。 –
class Song < ActiveRecord::Base
def initialize(*args)
super(*args)
return unless self.new_record?
self.play_count ||= 0
end
end
在我看來,我覺得這個答案是不錯的。儘管我們重寫了初始化方法,但是因爲在此方法的第一行調用了super,所以它沒有改變任何基類初始化方法,而這是面向對象編程的關鍵特性,我們可以覆蓋它,並添加一些在對象初始化的時候有更多的功能。此外,從數據庫讀取對象時,初始化程序不會被跳過,因爲超級函數在函數的第一行被調用。
IMO'after_initialize'比覆蓋重寫框架的方法更好,並且[Rails AR指南鼓勵使用](http://guides.rubyonrails.org/active_record_validations_callbacks.html#after_initialize-and-after_find)。問題是AR可能會從你下面改變並改變行爲。 –
感謝戴夫por你的建議,我認爲是最好的! – josal
attr_accessor在rails中只是虛擬變量,它不存儲在數據庫中,只能在活動記錄不在應用程序中保存或更新之前使用。 可以在模型中定義attr_accessor像
class Contact < ActiveRecord::Base
attr_accessor :virtual_variable
end
和類似形式使用: -
<div class="field">
<%= f.label :virtual %><br>
<%= f.text_field :virtual %>
</div>
,你可以發現,在控制器PARAM這些vartual變量值...
你可以使用美德寶石:
https://github.com/solnic/virtus
自述文件:
Virtus允許您使用關於類型,讀寫器方法可見性和強制行爲的可選信息來定義類,模塊或類實例的屬性。它支持很多強制和嵌入對象和集合的高級映射。
它特別支持default values。
- 1. Python3 - 默認值爲type的默認值?
- 2. tableView:viewForHeaderInSection:默認值?
- 3. 默認值
- 4. UIPickerView默認值
- 5. 默認值
- 6. 默認值:
- 7. DependencyProperty默認值
- 8. 默認值DatabaseGenerated
- 9. RingtonePreference默認值
- 10. p:selectOneButton默認值
- 11. 默認值f:textarea
- 12. JTextArea默認值?
- 13. 默認值
- 14. 默認值
- 15. mysql默認值?
- 16. 默認JavaScript值
- 17. 默認值
- 18. 默認值特
- 19. C#默認值
- 20. 默認值
- 21. 默認值
- 22. RichTextBox默認值?
- 23. 值或 「默認」
- 24. GetCultureInfo默認值
- 25. DateTimePicker默認值
- 26. 默認值
- 27. scipy.sparse默認值
- 28. MonoTouch.Dialog:No默認值
- 29. 默認值
- 30. 默認值
請注意,該示例僅適用於默認值false。我需要一個默認的true,所以我用:'@ politics.nil? ? true:@ politics' – micapam
如果您默認數組,請使用:'def politics; @politics || = [];除非您以其他方式爲政治賦值,否則「結尾」或「將不起作用。 –
我認爲Dave Newton建議的'after_initialize'方法是最好的解決方案 – josal