74169


このようにパラメータから動的に渡ってくるモデル名を変数から取得することは出来ますか？

[code]

    #`Test`はモデル名
    model_name = "Test"
    model_name.all
    
[/code]


CC BY-SA 4.0
2021-02-21T02:50:34.440
74168
2021-02-21T03:40:49.427
15167
question
ruby-on-rails ruby
railsのモデルを変数名で動的に取得したい


Ruby on Railsを使っている場合、`String#constantize`メソッドが使えます。

[code]

    'User'.constantize     # => User(id: ingeter, email: string, ...)
    'User'.constantize.all # => [#<User id: 2, email: 'foo@example.com', ...]>]
    
[/code]

また、Ruby on
Railsを前提としない場合、`Module#const_get`が使えます。(Railsを前提とするなら`String#constantize`のほうが便利かなと思います  
<https://docs.ruby-lang.org/ja/latest/method/Module/i/const_get.html>

[code]

    Object.const_get(:User)     # => User(id: ingeter, email: string, ...)
    Object.const_get(:User).all # => [#<User id: 1, email: 'foo@example.com', ...]>]
    
[/code]

ただしこれらはモデルに限らず任意のクラスを取得できるため、注意が必要です。

[code]

    # Stringクラスが取得できてしまう
    'String'.constantize # => String
    
    
    # ユーザーに見せたくないモデルも取得できてしまう
    'SecretModel'.constantize # => SecretModel(id: integer, ...)
    
[/code]

そのため、事前にユーザーから渡ってきたモデル名をバリデーションした方が良いでしょう。

また、許可するモデル名が少数の場合には、`String#constantize`を使わずに自分で対応を書いても良いかもしれません。

[code]

    # caseを使う例
    case model_name
    when 'User'
      User
    when 'Article'
      Article
    else
      raise "#{model_name} is not allowed!"
    end
    
    # Hashを使う例
    MODEL_TABLE = { 'User' => User, 'Article' => Article}
    
    MODEL_TABLE[model_name] || raise("#{model_name} is not allowed!")
    
[/code]


CC BY-SA 4.0
2021-02-21T03:40:49.427
74169
2021-02-21T03:40:49.427
21283
74168
answer