rails 中模型的默认值
Default values for models in rails
迁移时设置默认值好还是回调时设置默认值好?迁移中很难删除(或设置另一个)默认值,但在模型中它多了一段代码
在迁移中定义默认值也有一些缺点。当您只调用 Model.new
.
时,这将不起作用
我更喜欢编写一个 after_initialize
回调,它可以让我设置默认属性:
class Model < ActiveRecord::Base
after_initialize :set_defaults, unless: :persisted?
# The set_defaults will only work if the object is new
def set_defaults
self.attribute ||= 'some value'
self.bool_field = true if self.bool_field.nil?
end
end
作为一般规则,在后端,在模型和数据库中强制执行约束。这就像验证 JS 而不是在后端验证(PHP、ROR 等)。有人可以修改您的 JS 以通过验证,并且由于您没有在后端进行验证,您的网站可能会受到威胁。因此,始终在双方进行验证,至少如果您的应用服务器受到威胁,数据库服务器可能会提供一些防御。
在Rails 5中,attributes API允许指定默认值。语法简单,无需迁移即可更改默认值。
# db/schema.rb
create_table :store_listings, force: true do |t|
t.string :my_string, default: "original default"
end
# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
attribute :my_string, :string, default: "new default"
end
依靠@w-hile 的回答——这是一个很好的答案,除非你有一堆你想做的东西"settings" —
我厌倦了用一堆专用于设置的专栏污染我的模型,所以我写了 Setsy。
class User < ApplicationRecord
include ::Setsy::DSL
# each setting can be a hash, like posts_limit, or just a value
DEFAULT_SETTINGS = {
posts_limit: { value: 10 },
favorite_color: 'blue'
}.freeze
setsy :settings, column: :settings_data, defaults: DEFAULT_SETTINGS do |conf|
conf.reader :posts_limit_and_color do
"posts limit is #{posts_limit} and color is #{favorite_color}"
end
end
end
你可以,
user = User.first
user.settings # {posts_limit: 10, favorite_color: 'blue'}
user.settings.posts_limit # 10
user.settings.posts_limit.default? # true
user.assign_attributes(settings_data: { posts_limit: 15, favorite_color: 'blue' })
user.settings.posts_limit.default? # false
user.settings.posts_limit.default # 10
迁移时设置默认值好还是回调时设置默认值好?迁移中很难删除(或设置另一个)默认值,但在模型中它多了一段代码
在迁移中定义默认值也有一些缺点。当您只调用 Model.new
.
我更喜欢编写一个 after_initialize
回调,它可以让我设置默认属性:
class Model < ActiveRecord::Base
after_initialize :set_defaults, unless: :persisted?
# The set_defaults will only work if the object is new
def set_defaults
self.attribute ||= 'some value'
self.bool_field = true if self.bool_field.nil?
end
end
作为一般规则,在后端,在模型和数据库中强制执行约束。这就像验证 JS 而不是在后端验证(PHP、ROR 等)。有人可以修改您的 JS 以通过验证,并且由于您没有在后端进行验证,您的网站可能会受到威胁。因此,始终在双方进行验证,至少如果您的应用服务器受到威胁,数据库服务器可能会提供一些防御。
在Rails 5中,attributes API允许指定默认值。语法简单,无需迁移即可更改默认值。
# db/schema.rb
create_table :store_listings, force: true do |t|
t.string :my_string, default: "original default"
end
# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
attribute :my_string, :string, default: "new default"
end
依靠@w-hile 的回答——这是一个很好的答案,除非你有一堆你想做的东西"settings" —
我厌倦了用一堆专用于设置的专栏污染我的模型,所以我写了 Setsy。
class User < ApplicationRecord
include ::Setsy::DSL
# each setting can be a hash, like posts_limit, or just a value
DEFAULT_SETTINGS = {
posts_limit: { value: 10 },
favorite_color: 'blue'
}.freeze
setsy :settings, column: :settings_data, defaults: DEFAULT_SETTINGS do |conf|
conf.reader :posts_limit_and_color do
"posts limit is #{posts_limit} and color is #{favorite_color}"
end
end
end
你可以,
user = User.first
user.settings # {posts_limit: 10, favorite_color: 'blue'}
user.settings.posts_limit # 10
user.settings.posts_limit.default? # true
user.assign_attributes(settings_data: { posts_limit: 15, favorite_color: 'blue' })
user.settings.posts_limit.default? # false
user.settings.posts_limit.default # 10