Rails で、関連付けを行ったモデルを呼び出せなかったとき
Rails で、関連付けを行ったモデルを呼び出せなかったとき
Shop
と Reserve
が、 1:N
のとき。
# app/models/shop.rb
class Shop < ApplicationRecord
has_many :reserves, dependent: :destroy
end
# app/models/reserve.rb
class Reserve < ApplicationRecord
belongs_to :shop, required: true
end
NameError: uninitialized constant
Shop
に紐付いた、Reserve
を呼び出そうとすると、 NameError: uninitialized constant Shop::Reserf
となってしまいました。
pry(main)> Shop.last.reserves
Shop Load (0.6ms) SELECT `shops`.* FROM `shops` ORDER BY `shops`.`id` DESC LIMIT 1
NameError: uninitialized constant Shop::Reserf
from /Users/username/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.1.4/lib/active_record/inheritance.rb:166:in `compute_type'
複数形・単数形を確認
#pluralize
単数形の名詞を複数形に変換します。
#singularize
複数形の名詞を単数形に変換します。
irregular な処理
reserves
の単数形が reserf
として認識されていました。
pry(main)> "reserve".pluralize
=> "reserves"
pry(main)> "reserves".singularize
=> "reserf"
Rails
ドキュメントの pluralize
のページに、下記のように書かれていました。
「config/initializers/inflections.rb」に定義を追加することによって、不可算名詞を追加できる。
config/initializers/inflections.rb
config/initializers/inflections.rb
で、複数形から単数形、単数形から複数形の変換が irregular
なものは
ここに定義を追加することで、今回のような問題に対応できます。
# config/initializers/inflections.rb
...
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.irregular 'reserve', 'reserves'
end
...
定義後
reserves
の単数形が reserve
として認識されるようになりました。
pry(main)> "reserve".pluralize
=> "reserves"
pry(main)> "reserves".singularize
=> "reserve"
問題なく呼び出せます。
pry(main)> Shop.last.reserves
Shop Load (1.1ms) SELECT `shops`.* FROM `shops` ORDER BY `shops`.`id` DESC LIMIT 1
Reserve Load (1.7ms) SELECT `reserves`.* FROM `reserves` WHERE `reserves`.`shop_id` = 2473
=> []