def method1
join_tables = [:table1, :table2, :table3]
query_params = { "users.phone" => @mobile_number, "user_email" => @email}
user_query_condition = create_query_or_union(user_query_params) // returns "users.phone = 99999999 OR user_email = example@example.com"
return previous_query(join_tables, user_query_condition)
end
def method2
join_tables = [:table1]
query_params = { "users_email" => @email }
user_query_condition = create_query_or_union(user_query_params)
return live_query(join_tables, user_query_condition)
end
我有这样的多种方法,更糟糕的是,一些方法也包含两个类似的查询。只是,query_params
和返回的函数调用会有所不同。
所以,我正在考虑将所有这些代码放入一个函数中,该函数可以根据输入参数编写代码。例如,
我会调用result = awesome_method(join_tables, query_params, "live")
,那就是它。
有没有办法做到这一点?
答案 0 :(得分:1)
Ruby中的一些元编程没有错,这对于你有重复方法的情况很有用。除了消除重复之外,它还可以让您更好地了解所有不同的查询,例如:
METHODS = {
method1: {tables: [:table1, :table2, :table3],
params: {"users.phone" => @mobile_number, "user_email" => @email}},
method2: {tables: [:table1],
params: { "users_email" => @email },
live: true},
}
METHODS.each do |method, params|
define_method method do
join_tables = params[:tables]
query_params = params[:params]
user_query_condition = create_query_or_union(query_params) // returns "users.phone = 99999999 OR user_email = example@example.com"
if params[:live]
return live_query(join_tables, user_query_condition)
else
return previous_query(join_tables, user_query_condition)
end
end
end