передать объект или идентификатор объекта? - PullRequest
2 голосов
/ 07 декабря 2011

Учитывая следующий код, какой метод enroll лучше и почему? Или этот код должен быть улучшен каким-то другим способом?

Моя идея «лучше» для вышеизложенного в основном сводится к 1) наиболее философски правильному (лучшие практики) и 2) наиболее эффективному / эффективному.

Class Course < ActiveRecord::Base
  has_many :enrollments # basically a join table
  has_many :students, :source => :user, :through => :enrollments
  def enroll_this_way(student)
    self.enrollments << Enrollment.new(:course_id => self.id, :student_id => student.id)
  end
  # OR
  def enroll_that_way(student_id)
    self.enrollments << Enrollment.new(:course_id => self.id, :student_id => student_id)
  end
end

Ответы [ 2 ]

12 голосов
/ 07 декабря 2011
def enroll_this_way(student)
  self.enrollments.build :student => student
end
2 голосов
/ 07 декабря 2011

Оба, вероятно, не идеальны.course#enrollments<<(object, …) устанавливает внешние ключи для объектов регистрации, поэтому вам не нужно устанавливать :course_id на enrollment, в противном случае вам не нужно вызывать course#enrollments<<(object, …), если внешний ключ уже установлен, вы просто вызываете enrollment#save.

Как указывало @ zed_0xff, вы можете просто позвонить course#enrollments#build (или лучше course#enrollments.create, если вы хотите, чтобы изменения сохранялись в базе данных).

Кроме того, вы можете спокойно пропустить self.Нет никаких двусмысленностей относительно того, что такое enrollments и id.

Настоятельно рекомендуется Направляющие рельсов: 4.3 Ссылка на ассоциации has_many

Редактировать: Я только что понял, что не ответил на вопрос ОП.Разницы нет вообще.

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