【问题标题】:pass object or object id?传递对象或对象ID?
【发布时间】:2011-12-07 18:10:18
【问题描述】:

鉴于以下代码,哪个 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

【问题讨论】:

  • 我更喜欢与对象进行比较。但两者都应该转化为相似的性能。
  • 传递整数的唯一原因是如果您以某种方式获得了该数字而没有创建对象。但是,如果您已经拥有该对象,请传递它。对象创建将是代码中最长的部分。
  • @DGM 大多数时候我都会有 student.id,但我认为可能有一些更重要的考虑因素(设计模式、最佳实践等)。

标签: ruby-on-rails ruby oop activerecord


【解决方案1】:
def enroll_this_way(student)
  self.enrollments.build :student => student
end

【讨论】:

  • 这更好,原因有很多,最重要的是简洁。
【解决方案2】:

两者可能都不完美。 course#enrollments&lt;&lt;(object, …)在注册对象上设置外键,所以你不需要在enrollment上设置:course_id,或者如果外键已经设置,你不需要调用course#enrollments&lt;&lt;(object, …),你只需调用@987654326 @。

正如@zed_0xff 所指出的,您可以直接调用course#enrollments#build(如果您希望更改持久保存到数据库,则更好的是course#enrollments.create)。

此外,您可以放心地省略 self。关于enrollmentsid 是什么,没有任何歧义。

强烈推荐Rails Guides: 4.3 has_many Association Reference

编辑:我刚刚意识到我没有回答 OP 问题。完全没有区别。

【讨论】:

    猜你喜欢
    • 2013-11-16
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多