Company/Person class 繼承到父類別的validates_presence_of :name。
class Contact < ActiveRecord::Base
validates_presence_of :name
end
class Company < Contact
end
class Person < Contact
end
contact = Person.create( :name => "ihower")
contact.type # "Person"
class Contact < ActiveRecord::Base
self.abstract_class = true
validates_presence_of :name
end
class Company < Contact
end
class Person < Contact
end
因此,Active Record看見column名稱為type,自動假設你用STI,產生問題。
ActiveRecord::SubclassNotFound: Invalid single-table inheritance type: PowerUser is not a subclass of User
Example: Admin < User. Is it possible that my User will no longer be an Admin. Yes! Ah, so being admin is more likely a role that you have in organization. Inheritance won’t do.
Refactor from STI
交易Transactions
兩個動作都成功的情況下才會將這筆操作寫入資料庫,否則在其中一個動作失敗,就會放棄所有已做的操作。
要使用create!而不是create,因為前者驗證失敗才會丟出例外,好讓整個交易失敗。
User.transaction do
User.create!(:name => 'ihower')
Feed.create!
end
序列化Serialize
將object轉換成一個可被db儲存的純文字形態。
但是缺點是Serialize資料就失去了透過db查詢索引的功效,無法SQL的where條件索引。
class User < ActiveRecord::Base
serialize :settings
end
> user = User.create(settings: { "sex" => "male", "url" => "foo" })
> User.find(user.id).settings # => { "sex" => "male", "url" => "foo" }