我怎么能重构这个过程?

时间:2014-03-08 03:03:56

标签: ruby

好的。我有一些限制。主要是因为这对于更大的应用来说只是一件小事。

:vendor_username => Proc.new { |user|
  Spree::Vendor.find_by_user_id(user.id).username if Spree::Vendor.find_by_user_id(user)
}

这是我正在尝试重构的代码。它被证明是ars中真正的痛苦。

问题是这段代码是在哈希内部。

hash = {
  # proc here
}

我虽然这个:

hash = {}

if Spree::Vendor.find_by_user_id(user)
  hash[:vendor_username] = Proc.new { |user|
    Spree::Vendor.find_by_user_id(user.id).username
  }
end

我需要做的就是在if语句中添加值,但它会中断。即使我喜欢也不可能写出来。

我需要重构它,因为(a)它看起来并不好看(b)哈希内部会有更多的值。

2 个答案:

答案 0 :(得分:1)

def vendor_username(user)
  if vendor = Spree::Vendor.find_by_user_id(user.id)
    vendor.username
  end
end

hash[:vendor_username] = vendor_username(user)

答案 1 :(得分:0)

这就是我解决它的方法:

:vendor_username => Proc.new { |user|
  Spree::Vendor.find_by_user_id(user.id).username if Spree::Vendor.find_by_user_id(user)
}

第一个问题是if语句。我发现了这个:

:vendor_username => Proc.new { |user|
  Spree::Vendor.find_by_user_id(user.id).try(:username)
}

但我仍然依赖于DB。正如@naomik所指出的那样:find_by_*已弃用,但由于我使用的是Rails 3.2.x,因此保留了v = Proc.new { |current_user| Spree::Vendor.find_by_user_id(current_user) } # and inside of the hash would be :vendor_username => Proc.new { |user| v.call(user.id).try(:username) } 。为了解决这个问题,我把它放在一个过程中,瞧:

{{1}}

我花了好几个小时试图解决这个问题。无法相信它终于结束了。

顺便说一句:我有很多限制。正如@JCorcuera所展示的那样,我确实尝试(并且有意)抽取数据。代码一直在破坏,并且不了解当前用户是谁。