Ruby on rails сохраняет определенное поле в базе данных - PullRequest
8 голосов
/ 04 января 2011

В моей базе данных есть таблица house, в которой много полей, таких как «color», «price». Как я могу сохранить только определенное поле после обновления

если у меня есть это,

@house.colour = newcolour
@house.save

это сохранит все остальные поля, включая house.colour и house.price
(в моем случае цена должна обновляться программно одновременно с цветом, но не должна сохраняться. Должен быть только house.colour сохранено в базе данных)

я пытался сделать

@house.colour = newcolour
@ House.colour.save

но это показывает мне ошибку

Можно ли сохранить только значение @ house.colour?

Спасибо за любые предложения

Ответы [ 3 ]

22 голосов
/ 04 января 2011

Можно обновить точный набор полей с помощью update_attributes .

@house.update_attributes(:colour => newcolour)

Вы можете обновить одно поле с помощью update_attribute .

@house.update_attribute(:colour, newcolour)
10 голосов
/ 08 ноября 2014

Есть несколько способов обновить определенные поля сохраняемого объекта.

  • update(attributes)

    Обновляет атрибуты модели из переданного хэша и сохраняет запись, завернутую в транзакцию. Если объект недействителен, сохранение не удастся и будет возвращено значение false.

  • update!(attributes)

    Обновляет свой приемник так же, как обновление, но звонки сохраняются! вместо сохранения создается исключение, если запись недействительна.

  • update_attribute(name, value)

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

    • Проверка пропущена.

    • Вызваны обратные вызовы.

    • Столбец updated_at / updated_on обновляется, если этот столбец доступен.

    • Обновляет все грязные атрибуты в этом объекте.

    Этот метод вызывает ActiveRecord::ActiveRecordError, если атрибут помечен как только для чтения.

  • update_attributes(attributes)

    Псевдоним для update

  • update_attributes!(attributes)

    Псевдоним для update!

  • update_column(name, value)

    Эквивалент update_columns(name => value)

  • update_columns(attributes)

    Обновляет атрибуты непосредственно в базе данных, выдавая оператор SQL UPDATE, и устанавливает их в получателе.

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

    • Проверки пропускаются.

    • Обратные вызовы пропускаются.

    • updated_at / updated_on не обновляются.

    Этот метод вызывает ActiveRecord::ActiveRecordError при вызове новых объектов или когда хотя бы один из атрибутов помечен как доступный только для чтения.

update и update! (и, следовательно, update_attributes и update_attributes!), вызов save. Так что в вашей ситуации вы должны попробовать использовать update_column или update_columns.

1 голос
/ 04 января 2011

Ответ DanSingerman показывает, как обновить отдельное поле.

Но, если цена является чисто рассчитанным значением, это не должно быть поле в вашей таблице.Но метод в вашей модели:

class House < ActiveRecord::Base
  def price
    return 100 if colour == "red"
    return 200
  end
end

(Это, очевидно, очень упрощенный метод «расчета» цены)

Теперь вы можете использовать @house.price, как и раньше, и это зависитпо цвету, но это больше не поле таблицы.

Примечание: Если вычисление является сложным, вы можете «кэшировать» его в переменной класса и переопределить метод colour= для удаленияпеременная класса, когда цвет меняется.

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