是否可以根据ruby中的条件编写一个编写代码的程序?

时间:2015-07-18 11:00:15

标签: ruby

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"),那就是它。

有没有办法做到这一点?

1 个答案:

答案 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