Ruby on Rails: обновить атрибут

Google серьезно подводит меня прямо сейчас. Все, что мне нужно сделать, это обновить один атрибут, установив пользователя в качестве администратора, из консоли Heroku rails.

Я не могу найти ни одного простого ответа. Я пытался:

Record.update_attribute(:roles_mask, "1")

Где запись является правильной записью.

'неопределенный метод 'обновить атрибут''

Я не могу просто набрать Record.roles_mask = 1?

РЕДАКТИРОВАТЬ.

Я использовал Record, и мне не следовало этого делать в примере. Я сделал именно это:

ian = User.where(:id => '5')

ian.update_attribute(:roles_mask, '1')

Error: undefined method 'update_attributes'

person Ian Ellis    schedule 10.03.2014    source источник
comment
Вы пытаетесь обновить один или все?   -  person Mark Swardstrom    schedule 10.03.2014
comment
Вызовите update_attribute в классе instance Record, а не в классе Record. update_attribute - это метод экземпляра, а не метод класса.   -  person Kirti Thorat    schedule 10.03.2014
comment
попробуйте использовать update_columns вместо update_attributes   -  person Justin    schedule 10.03.2014
comment
Если обновить один record = Record.find(...); record.update_attribute(:roles_mask, "1"). Если обновить все, Record.update_all(:roles_mask, "1")   -  person Mark Swardstrom    schedule 10.03.2014
comment
Спасибо ^^ Большое ^^   -  person zero_cool    schedule 30.09.2014


Ответы (3)


Проблема в том, что использование функции .where создает отношение, а не находит саму запись. Сделай это:

ian = User.find(5)
ian.update_attribute(:roles_mask, '1')

Или, если вы хотите использовать .where, вы можете сделать это:

ian = User.where(:id => 5)
ian.first.update_attribute(:roles_mask, '1')

РЕДАКТИРОВАТЬ

Подробнее о том, почему это происходит, см. в этом ответе.

person Mike S    schedule 10.03.2014
comment
В качестве примечания для будущих поисков в Google: еще одна проблема заключалась в том, что переменная, которую я использовал, была защищена. Пришлось разрешить массовое назначение. attr_accessible :roles_mask. Благодарю за ваш ответ. - person Ian Ellis; 10.03.2014

Чтобы использовать update_attribute (или update_attributes), вам нужно вызвать его из экземпляра, а не из класса.

rails c> rec = Record.find(1)
rails c> rec.update_attribute(:att, 'value')
rails c> rec.update_attributes(att: 'value', att2: 'value2')

Я думаю, что это должно позаботиться о вашей проблеме.

person craig.kaminsky    schedule 10.03.2014
comment
Не работает. У меня ian = User.where(:id =› '5') ian.update_attribute(:roles_mask, '1') error: undefined method 'update_attribute' Также спасибо за ответ. Для записи, я только пытаюсь обновить 1 запись. - person Ian Ellis; 10.03.2014
comment
Проблема в том, что where() возвращает отношение ActiveRecord. Попробуйте выполнить одно из следующих действий: ian = User.find(5) или ian = User.where(id: 5).first ... игнорировать. Только что увидел, что @Mike Slutsky так сказал. - person craig.kaminsky; 10.03.2014

Предложение where возвращает массив, и вы пытаетесь выполнить запрос на обновление массива, поэтому вы получили ошибку.

вы должны попытаться найти первую запись

ian = User.where(:id => 1).first
or
ian = User.find(1)
or
ian = User.find_by_id(1)

теперь ваш запрос на обновление будет работать.

ian.update_attribute(:roles_mask, '1')
person uma    schedule 10.03.2014