Как динамически получить класс в Ruby так же, как мы можем вызвать send для динамического запуска метода? - PullRequest
0 голосов
/ 03 августа 2020

Я знаю, что мы можем это сделать:

Person.send(:new)

Но допустим, у нас есть такой код:

class Person
  def self.plural
    'people'
  end
end

Есть ли способ, который позволяет нам это сделать?

klass = Class.get_class('Person')
klass.send(:plural)
# => 'people'

Как называется эта концепция?

Это плохая практика?

Ответы [ 2 ]

3 голосов
/ 03 августа 2020

Ruby фактически позволяет вам получить объект класса из аргумента в строке, используя const_get. Например

klass = Object.const_get("Person") # => return Person class
1 голос
/ 03 августа 2020

Да, вы можете сделать что-то вроде этого, для динамического в рельсах скрипт будет примерно таким:

# => class_send("Article", :new)

def class_send(class_name, send_name)
  classes_array = ApplicationRecord.subclasses.collect(&:name)
  # => ["User", "Article"] - returns all models names
  
  get_index = classes_array.index(class_name)
  # => 1
  
  req_class = Object.const_get classes_array[get_index]
  # => Article Class
  
  req_class.send(send_name)
  # => Runs Article.new
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...