簡體   English   中英

如何使用Rails中的值初始化ActiveRecord?

[英]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)中找不到簡單的標准方法。

1.覆蓋初始化

def initialize(attributes = {}, options = {})
  @name  = attributes[:name]
  @email = f(attributes[:email])
  @admin = false
end

但是從DB創建記錄時可能會錯過

2.使用after_initialize回調

通過覆蓋它:

def after_initialize(attributes = {}, options = {})
  ...
end

或者用宏:

after_initialize : my_own_little_init
def my_own_little_init(attributes = {}, options = {})
  ...
end

但可能存在一些棄用問題

SO中還有其他一些鏈接,但它們可能已過時。


那么,使用什么是正確/標准的方法?

當應用於所有記錄時,應在架構中定義默認值。 所以

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM