Проблемы с назначением пользовательских атрибутов Rails - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть приложение rails с устройством для моей пользовательской модели. В моем приложении пользователи могут записаться на курсы через зачисления. Я добавил часы и часы. После регистрации я пытаюсь добавить часы, изученные для текущего пользователя, но по некоторым причинам это просто не будет работать. Я не получаю никакой ошибки, но она не будет вставлена ​​в БД. У меня есть метод регистрации в моей пользовательской модели, который выглядит следующим образом:

def enroll!(course, user)
    enrollments.create!(:course_id => course.id, :active => true)
    user.hours_taught = user.hours_taught + (course.hours_long)
end

И да, я убедился, что атрибуты доступны. Все еще не идти. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Почему этот метод, который вы определяете для модели User, принимает в качестве параметра объект user?Вы должны определить его следующим образом:

def enroll!(course)
  enrollments.create!(:course => course, :active => true)
  self.hours_taught = self.hours_taught + (course.hours_long)
  self.save!
end

Этот метод будет определен как метод экземпляра для этого класса, поэтому вы можете вызывать его следующим образом:

user.enroll!(course)

Это означает, что вы выигралиНе нужно передавать через пользователя в качестве аргумента этот метод.Внутри метода мы берем объект course и присваиваем его регистрации, выполняем математические часы и затем сохраняем его, используя save!, что вызовет исключение, если reocrd недействителен (либо ActiveRecord::RecordInvalid, либо ActiveRecord::RecordNotSaved)

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

Какую ошибку вы получаете?

Кроме того, обычно метод экземпляра модели не включает параметр для самого объекта. Используйте self в модели. Например,

class User << ActiveRecord::Base
  ...

  def enroll!(course)
    enrollments.create!(:course_id => course.id, :active => true)
    self.hours_taught = self.hours_taught + (course.hours_long)
    save!
  end
  ...

Добавлено Зачем нужно сохранение ...

Помните, что ActiveRecord действительно отслеживает данные своих моделей в двух местах: в «памяти» и в системе баз данных.

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

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

В этом примере вы назвали метод enroll! ! это соглашение, которое подразумевает, что вы хотите зарегистрироваться! способ «сделать все», включая обновление базы данных.

Следовательно, в самом методе вам необходимо сохранить данные в БД.

Проблема с включением save в метод объекта заключается в том, что вы можете получить больше сохранений в базе данных, чем это действительно необходимо. Гораздо лучше сохранить сразу несколько изменений, чем сделать несколько сохранений в БД. Но вы не хотите скручивать себя в узлы, чтобы минимизировать экономию. - Просто помните об этой проблеме при планировании потока SW.

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