有人能告诉我如何简化这个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
应该能够更新他的个人资料,这就是我将所有这些值存储在数据库而不是模型中的原因。
答案 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'