В Ruby есть альтернативный и более элегантный способ вызова метода, чем «случай - когда»? - PullRequest
3 голосов
/ 21 декабря 2011

В Rails 3.1 я хочу создать внедренный объект, используя метод create, который принимает данные параметров, но мне интересно, есть ли более элегантный способ сделать это, чем метод case ниже:

def method_call(obj,data)
  case obj
  when 'a' then User.create_a(data)
  when 'b' then User.create_b(data)
  when 'c' then User.create_c(data)
  end
end

Я действительно хотел бы сделать что-то вроде следующего, но это вызывает ошибку из-за данных, которые я передаю:

def method_call(obj,data)
  User.send("create_#{obj}")(data)
end

Есть предложения? Заранее спасибо.

1 Ответ

11 голосов
/ 21 декабря 2011

Метод send принимает те же параметры, что и вызываемый метод:

User.send("create_#{obj}", data)

Независимо от того, является ли это наиболее элегантным решением, зависит: я бы оставил процесс принятия решения до класса User, что может происходить различными способами (например, такая посылка, хеш Proc с и т. Д.) Еще одна альтернатива - заводское обслуживание.

User.create(how, data) # "how" is a, b, c

Где бы он ни жил, сделайте это очевидным - это позволяет легко расширять, исправлять и рассуждать о.

...