Значения по умолчанию attr_accessor

Я использую рельсы, и я хочу сделать так, чтобы attr_accessor :politics был установлен по умолчанию на false.

Кто-нибудь знает, как это сделать, и может объяснить это простыми словами для меня?

Ответ 1

Rails имеет attr_accessor_with_default, чтобы вы могли написать

class Like
  attr_accessor_with_default :politics,false
end

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

и все это

UPDATE

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

Ответ 2

Если вы определяете свой attr_accessor, по умолчанию значение nil. Вы можете написать ему, тем самым сделав его !nil

Ответ 3

class Song < ActiveRecord::Base
    def initialize(*args)
    super(*args)
      return unless self.new_record?
      self.play_count ||= 0
    end
end

По-моему, я считаю, что этот ответ хорош. Хотя мы переопределяем метод initialize, но поскольку super вызывается в первой строке этого метода, он ничего не изменил для метода инициализации базового класса, скорее это ключевая особенность объектно-ориентированного программирования, которую мы можем переопределить, и добавить некоторые больше функциональности во время инициализации объектов. И также инициализатор не будет пропущен при чтении объектов из базы данных, так как super вызывается в первой строке функции.

Ответ 4

Вы можете использовать жемчужину virtus:

https://github.com/solnic/virtus

Из README:

Virtus позволяет вам определять атрибуты на классах, модулях или экземплярах классов с дополнительной информацией о типах, видимостью чтения/записи метода и принудительностью. Он поддерживает множество принуждений и расширенное отображение встроенных объектов и коллекций.

Он специально поддерживает значения по умолчанию.

Ответ 5

Это не выполняется в attr_accessor, скорее, при переносе.

Итак, вы можете выполнить миграцию

(1) rails g migration ChangePoliticsColumnToDefaultValueFalse

(2) добавить это в def self.up

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

В нижней строке указано, что атрибуты по умолчанию задаются в миграциях.

Надеюсь, это поможет!

Edit:

Есть также похожие вопросы, на которые был дан ответ:

Как здесь и здесь

Ответ 6

Я использую эту форму в ActiveRecord:

class Song < ActiveRecord::Base

    def initialize(*args)
      super(*args)
      return unless self.new_record?
      self.play_count ||= 0
    end
end

Ответ 7

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>

и вы можете найти это значение vartual переменной в параметре контроллера...