69

我正在使用rails,我想将其attr_accessor :politics设置为默认设置为false。

有谁知道如何做到这一点并且能够为我简单地解释它?

4

7 回答 7

148

Rails 有attr_accessor_with_default所以你可以写

class Like
  attr_accessor_with_default :politics,false
end

i = Like.new
i.politics #=> false

就这样

更新

attr_accessor_with_default在 Rails 3.2 中已被弃用。你可以用纯 Ruby 来代替

class Like
  attr_writer :politics

  def politics
    @politics || false
  end
end

i = Like.new
i.politics #=> false
于 2012-01-08T04:09:50.040 回答
1

如果您定义您的attr_accessor,则默认值为nil。你可以给它写信,从而使它!nil

于 2012-04-18T02:21:13.350 回答
1

您可以使用 virtus gem:

https://github.com/solnic/virtus

从自述文件:

Virtus 允许您使用有关类型、读取器/写入器方法可见性和强制行为的可选信息来定义类、模块或类实例的属性。它支持嵌入对象和集合的许多强制和高级映射。

它特别支持默认值

于 2016-12-27T19:58:19.457 回答
0
class Song < ActiveRecord::Base
    def initialize(*args)
    super(*args)
      return unless self.new_record?
      self.play_count ||= 0
    end
end

在我看来,我认为这个答案很好。虽然我们重写了该initialize()方法,但是由于在该方法的第一行调用了 super,它并没有改变基类initialize()方法的任何内容,而是面向对象编程的一个关键特性,我们可以重写它,并添加一些在初始化对象时提供更多功能。并且在从数据库读取对象时也不会跳过初始化程序,因为super在函数的第一行调用。

于 2013-01-15T06:37:02.013 回答
-4

我一直在 ActiveRecord 中使用这种形式:

class Song < ActiveRecord::Base

    def initialize(*args)
      super(*args)
      return unless self.new_record?
      self.play_count ||= 0
    end
end
于 2012-05-23T19:55:23.393 回答
-5

这不是在 attr_accessor 中完成的,而是在您的迁移中完成的。

所以..你可以执行迁移

(1)rails g migration ChangePoliticsColumnToDefaultValueFalse

(2)添加这个def self.up

def self.up change_column :your_table, :politics, :boolean, :default => 0 end

底线是在迁移中设置了默认属性。

希望这可以帮助!

编辑:

还有一些类似的问题也得到了很好的回答:

喜欢这里这里

于 2011-07-16T05:16:49.287 回答
-6

rails 中的 attr_accessor 只是不存储在数据库中的虚拟变量,它只能在活动记录不保存或更新应用程序之前使用。您可以在模型中定义 attr_accessor

class Contact < ActiveRecord::Base
attr_accessor :virtual_variable
end

并以如下形式使用:-

 <div class="field">
    <%= f.label :virtual %><br>
    <%= f.text_field :virtual %>
  </div>

你可以在控制器参数中找到这些虚拟变量值......

于 2015-03-20T14:04:01.927 回答