значение не устанавливается с '=' в рельсах - PullRequest
1 голос
/ 06 января 2020

Attached screenshot for the proof У меня есть модель, которая выглядит примерно так:

class At::ModalityCombo < Base
  self.table_name = 'at_modalites_at_combos'

  belongs_to :at_modality, :class_name => 'At::Modality', foreign_key: :modality_id
  belongs_to :at_combo, :class_name => 'At::Combo', foreign_key: :combo_id

  attr_reader :modality_day
  attr_writer :modality_day
end

Миграция для столбца modality_day выглядит так:

class AddDayInModalityCombo < ActiveRecord::Migration[5.2]
  def up
    add_column :at_modalites_at_combos, :modality_day, :integer, default: 0
  end

  def down
    remove_column :at_modalites_at_combos, :modality_day
  end
end

Вкл. консоль rails,

abc = At::ModalityCombo.new
abc.modality_day = 4
abc

Вывод:

modality_id: nil, combo_id: nil, modality_day: 0

Почему modality_day по-прежнему равен 0?

Ответы [ 2 ]

3 голосов
/ 06 января 2020

Я думаю, что вы здесь путаете Rails.

  1. У вас есть столбец с именем modality_day в модели Active Record. Это позволяет вам читать / записывать это свойство в случаях At::ModalityCombo.
  2. У вас также есть attr_reader и attr_writer настройки для modality_day.

Похоже на attr_writer / attr_reader переопределяет методы, которые обычно позволяют вам управлять свойством, определенным в вашей базе данных. Удаление их должно исправить это и заставить работать так, как вы ожидаете.


attr_reader :modality_day в основном эквивалентно:

def modality_day
  @modality_day
end

И attr_writer :modality_day в основном эквивалентно:

def modality_day=(value)
  @modality_day = value
end

Эти методы управляют переменной экземпляра, но Active Record не сохраняет данные вашей базы данных таким же образом.

0 голосов
/ 07 января 2020

attr_reader, attr_writer и attr_accessor вообще не должны использоваться в моделях Rails (по крайней мере, в Rails 5.0+). Это встроенные в Ruby методы метапрограммирования для создания сеттеров и геттеров.

ActiveRecord фактически читает схему прямо из БД и создает специальные сеттеры и геттеры, соответствующие столбцам в таблице БД. Эти сеттеры являются световыми годами от сеттера c attr_writer - они выполняют приведение типов, грязное отслеживание и т. Д. c.

Если вы используете attr_accessor, вы перезаписываете сеттер, и ваша модель перестанет существовать. атрибут среди прочего.

Для «виртуальных атрибутов», которые не сохранены в базе данных, используйте атрибуты api , которые используют значения по умолчанию и приведение типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...