我正在为以下情况寻求一些最佳实践建议。
我有以下骨架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/