如何从这个Ruby函数中删除重复?

时间:2013-11-27 15:32:07

标签: ruby

有人能告诉我如何简化这个Ruby函数吗?

class Profile < ActiveRecord::Base

  before_create :set_defaults

  def set_defaults
    self.users_sort_column      = "created_at"      
    self.companies_sort_column  = "name"
    self.people_sort_column     = "last_name"
    self.projects_sort_column   = "name"
    self.invoices_sort_column   = "number"
    self.payments_sort_column   = "number"

    self.users_sort_direction     = "desc"      
    self.companies_sort_direction = "asc"
    self.people_sort_direction    = "asc"
    self.projects_sort_direction  = "asc"
    self.invoices_sort_direction  = "desc"
    self.payments_sort_direction  = "desc"
  end

end

它的重复次数太多了。谢谢你的帮助。

P.S:每个user应该能够更新他的个人资料,这就是我将所有这些值存储在数据库而不是模型中的原因。

4 个答案:

答案 0 :(得分:1)

您可以做的是将哈希从名称指向排序列和方向的数组。例如:

sorts["user"] = ["created_at", "desc"]
sorts["companies"] = ["name", "asc"]
... etc ....

您也可以使用符号而不是字符串作为键。代码将变得有点短,但更重要的是,给定排序的两个参数都在一个地方,使代码更容易理解和维护。

答案 1 :(得分:1)

如果您想坚持目前的组织形式:

def set_defaults
  self.sort = {
    users:     {column: "created_at", direction: "desc"},
    companies: {column: "name",       direction: "asc"},
    people:    {column: "last_name",  direction: "asc"},
    projects:  {column: "name",       direction: "asc"},
    invoices:  {column: "number",     direction: "desc"},
    payments:  {column: "number",     direction: "desc"}
  }
end

其他地方:

module DefaultSort
  def default_sort
    column    = Default.sort[self.name.tableize.to_sym][:column]
    direction = Default.sort[self.name.tableize.to_sym][:direction]
    self.order("#{column} #{direction}")
  end
end

class User
  extend DefaultSort
end

User.default_sort.to_sql #=> "SELECT * FROM users ORDER created_at desc"

答案 2 :(得分:1)

我认为没有重复代码可以写成如下:

def set_defaults
  sort_column_direction = {
    users:      ["created_at",  "desc"],
    companies:  ["name",       "asc"],
    people:     ["last_name",  "asc"],
    projects:   ["name",        "asc"],
    invoices:   ["number",      "desc"],
    payments:   ["number",      "desc"]
  }
  sort_column_direction.each do |key,value|
    self.send("#{key}_sort_column=", value[0])
    self.send("#{key}_sort_direction=", value[1])
  end 
end

答案 3 :(得分:0)

我不同意这里有太多的重复。虽然它没有启发Ruby代码,但很清楚你正在做什么。

您当然可以设置某种数据结构,例如散列,然后通过循环数据结构通过元编程设置这些值。但代码看起来会更复杂,并且行数会增加。所以这样做并不是一种改进。记住:清晰度是王道。

如果您正在进行面向对象编程(我怀疑您正在进行),那么您将拥有类:User,Company,People,Project等。如何设置sort_column 和每个类中的sort_direction?这些属性应该在类中,以便更好地隐藏信息。

如果您正在使用Rails,则约定是在每个模型中定义默认范围,例如

default_scope :order => 'created_at DESC'