我和一个 friend 的又一次争论。考虑这段代码:
class User < ActiveRecord::Base
has_many :groups
def in_group?(group)
groups.include?(group)
end
end
class Group < ActiveRecord::Base
has_many :members
def add_user(user)
members << user
end
end
我的观点是,这些方法给代码增加了额外的不必要的复杂性,而且很难猜到——比如为什么#in_group?但不是#is_a_member_of?,或者为什么#add_user 而不是#add_member,等等。根据我 4 年的 Rails 经验和 20 年的编程经验,我最好遵循 AR 语义并使用 User#groups.include?(group) 和 Group#members << user。它们很容易猜到,如果我需要一些额外的功能,我可以使用 has_many :members 的回调并覆盖 User#groups.include?如果有必要,在关联扩展模块中。
但是我的 friend 认为最好使用快捷方式来创建“抽象点”,并且最好扩展此代码而不是使用回调或重载。
你怎么看?
附言明确一点,我讨厌“如果……会怎样”的方法:)
最佳答案
我完全同意不应添加这些方法。创建其他相关对象不是模型的工作。这是协会代理人的工作。我还要注意重写关联代理行为,因为由于代理的实现方式,您可能会看到一些奇怪的副作用。
关于ruby-on-rails - 添加快捷方式还是遵循 ActiveRecord 语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/526133/