rails中模型的默认值

时间:2015-04-11 07:24:40

标签: ruby-on-rails ruby activerecord rails-activerecord

在迁移或回调中设置默认值是否更好?在迁移中删除(或设置另一个)默认值很困难,但在模型中又多了一段代码

4 个答案:

答案 0 :(得分:26)

定义迁移中的默认值也有一些缺点。只需拨打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 

答案 1 :(得分:12)

在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

答案 2 :(得分:1)

作为一般规则,在后端,在模型和数据库中强制执行约束。这就像验证JS而不是在后端验证(PHP,ROR等)。有人可以修改您的JS以通过验证,因为您没有在后端验证,您的网站可能会受到损害。因此,始终在双方都进行验证,至少如果您的应用服务器受到损害,数据库服务器可能会提供一些防御。

答案 3 :(得分:0)

@ w-hile答案的小猪支持-这是一个很好的答案,除非您有很多事情想要进行“设置”-

我厌倦了厌倦使用一堆专门用于设置的列来污染我的模型,所以我写了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