我有以下复杂的方法。我正在尝试寻找并实现可能的改进。现在我将最后一个 if 语句移动到 Access
类。
def add_access(access)
if access.instance_of?(Access)
up = UserAccess.find(:first, :conditions => ['user_id = ? AND access_id = ?', self.id, access.id])
if !up && company
users = company.users.map{|u| u.id unless u.blank?}.compact
num_p = UserAccess.count(:conditions => ['user_id IN (?) AND access_id = ?', users, access.id])
if num_p < access.limit
UserAccess.create(:user => self, :access => access)
else
return "You have exceeded the maximum number of alotted permissions"
end
end
end
end
我还想在重构之前添加规范。我添加了第一个。应该如何看起来像其他人?
describe "#add_permission" do
before do
@permission = create(:permission)
@user = create(:user)
end
it "allow create UserPermission" do
expect {
@user.add_permission(@permission)
}.to change {
UserPermission.count
}.by(1)
end
end
最佳答案
这是我的做法。
使对 Access 的检查更像初始断言,并在发生这种情况时引发错误。
创建一种新方法来检查现有用户访问权限 - 这似乎可重用且更具可读性。
然后,公司限制对我来说更像是一种验证,将其作为自定义验证移至 UserAccess 类中。
class User
has_many :accesses, :class_name=>'UserAccess'
def add_access(access)
raise "Can only add a Access: #{access.inspect}" unless access.instance_of?(Access)
if has_access?(access)
logger.debug("User #{self.inspect} already has the access #{access}")
return false
end
accesses.create(:access => access)
end
def has_access?(access)
accesses.find(:first, :conditions => {:access_id=> access.id})
end
end
class UserAccess
validate :below_company_limit
def below_company_limit
return true unless company
company_user_ids = company.users.map{|u| u.id unless u.blank?}.compact
access_count = UserAccess.count(:conditions => ['user_id IN (?) AND access_id = ?', company_user_ids, access.id])
access_count < access.limit
end
end
关于ruby-on-rails - 如何使用 Rspec 重构 Rails 模型中的复杂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13146445/