我正在为以下情况寻求一些最佳实践建议。
我有以下骨架activerecord模型:

# user.rb
class User < ActiveRecord::Base
  has_many :country_entries, dependent: destroy
end

# country_entry.rb
class CountryEntry < ActiveRecord::Base
  belongs_to :user
  validates :code, presence: true
end

现在假设我需要得到一个逗号分隔的特定用户的CountryEntry代码列表。问题是,我应该把这个方法放在哪里?有两种选择:
# user.rb
#...
  def country_codes
    self.country_entries.map(&:code)
  end
#...

-或
# country_entry.rb
#...
  def self.codes_for_user(user)
    where(user_id: user.id).map(&:code)
  end
#...

所以api应该是:@current_user.country_codes-或者-CountryEntry.codes_for_user(@current_user)
似乎把代码放在country_entry.rb中会使一切变得更为分离,但这会使api更加难看。在这个问题上有没有任何一般或个人经验方面的最佳做法?

最佳答案

实例方法vs类方法:如果方法是针对实例的,那么当然最好是实例方法。
在用户模型中vs在Coutry模型中:用户模型获胜。德米特定律认为只有一个点是红宝石。如果你有机会这样做,当然最好跟着做。
结论:你的第一种方法是成功的。

# user.rb
def country_codes
  self.country_entries.map(&:code)
end

加:德米特定律参考
http://en.wikipedia.org/wiki/Law_of_Demeter
http://rails-bestpractices.com/posts/15-the-law-of-demeter
http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/

09-28 04:02