Объединение виртуальных атрибутов в один реальный атрибут, не сохраняемый из вида - Active Record - PullRequest
0 голосов
/ 09 декабря 2011

Я использую виртуальные атрибуты, чтобы выделить список параметров через запятую в представлении, а затем пытаюсь рекомбинировать их для сохранения в моей модели Active Record.

Учитывая реальный атрибут "ad_columns", который по умолчанию равен "1,1,1,1"

Я разбил их на отдельные атрибуты формы:

attr_accessor :top_rows

#Getter
def top_rows
  split = ad_rows.split(',', 4)
  split[0]
end

#Setter
def top_rows=(trows)
  ad_rows_will_change!
  self.ad_rows = [trows, self.right_rows, self.bottom_rows, self.left_rows].join(",")
end

Затем повторите это для правого, нижнего, левого и правого.

Учитывая объект, если я вызываю "object.top_rows", я получаю "1", и если я обновляю его в irb:

object.top_rows = "3"

Затем он корректно обновляет реальный атрибут ad_rows. Я вижу, что у объекта есть изменения, и когда я делаю

object.save

Изменения обновляются в базе данных.

Проблема в том, что это НЕ работает с точки зрения. Это не сохранит в базу данных. Я даже использовал logger.info, чтобы увидеть, изменилась ли модель, и она покажет, что «ad_rows» действительно была изменена, но активная запись все еще НЕ обновляет реальный атрибут.

Я не могу понять, почему это происходит. Я просто делаю это неправильно? :) Спасибо.

Почему это работает в irb, а не в представлении?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2011

Кажется, что поскольку атрибут: ad_rows не передавался в параметрах, он не распознавался как измененный контроллером.

Я должен был добавить:

object.ad_rows_will_change!

На мой контроллер, чтобы заставить его сохранить столбец ad_rows.

Я не уверен, что это лучшее решение, но пока оно работает.

0 голосов
/ 09 декабря 2011

Я бы начал с избавления от attr_accessor :tops_rows.

Эта строка создает дополнительные и, возможно, конфликтующие методы экземпляра для получения и установки переменной экземпляра @top_rows и не затрагивает атрибуты ActiveRecord.

Что касается того, почему это не работает в представлении, я бы проверил, что вы добавили :ad_rows к attr_accessible в модели.Это позволяет ActiveRecord вносить изменения в столбец как часть пакетных операций (изменяется более одного атрибута). Документация .

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