[英]How to initialize an ActiveRecord with values in Rails?
在普通的java中我會使用:
public User(String name, String email) {
this.name = name;
this.email = f(email);
this.admin = false;
}
但是,我在使用ActiveRecords的rails(3.2.3)中找不到簡單的標准方法。
def initialize(attributes = {}, options = {})
@name = attributes[:name]
@email = f(attributes[:email])
@admin = false
end
after_initialize
回調 通過覆蓋它:
def after_initialize(attributes = {}, options = {})
...
end
或者用宏:
after_initialize : my_own_little_init
def my_own_little_init(attributes = {}, options = {})
...
end
但可能存在一些棄用問題 。
那么,使用什么是正確/標准的方法?
當應用於所有記錄時,應在架構中定義默認值。 所以
def change
creates_table :posts do |t|
t.boolean :published, default: false
t.string :title
t.text :content
t.references :author
t.timestamps
end
end
在這里,每個新帖子都會有錯誤發布。 如果要在對象級別使用默認值,最好使用Factory樣式實現:
User.build_admin(params)
def self.build_admin(params)
user = User.new(params)
user.admin = true
user
end
根據Rails指南,最好的方法是使用after_initialize 。 因為初始化我們必須聲明超級,所以最好使用回調。
我喜歡的一個解決方案是通過范圍:
class User ...
scope :admins, where(admin: true)
然后你可以做到這User.admins.new(...)
通過User.admins.new(...)
創建管理員狀態的新用戶(即使用admin
== true
),並以與User.admins
相同的方式獲取所有管理員。
您可以制作一些范圍,並使用其中的少數范圍作為創建/搜索的模板。 您也可以使用具有相同含義的default_scope
,但默認情況下不使用名稱。
今天早上我正在尋找類似的東西。 雖然在數據庫中設置默認值顯然會起作用,但它似乎打破了Rails的約定,即應用程序處理數據完整性(因此默認值?)。
我偶然發現了這篇文章 。 由於您可能不想立即將記錄保存到數據庫,我認為最好的方法是通過調用write_attribute()
來覆蓋initialize方法。
def initialize
super
write_attribute(name, "John Doe")
write_attribute(email, f(email))
write_attribute(admin, false)
end
這將在軌道4中工作。
def initialize(params)
super
params[:name] = params[:name] + "xyz"
write_attribute(:name, params[:name])
write_attribute(:some_other_field, "stuff")
write_attribute(:email, params[:email])
write_attribute(:admin, false)
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.