hene

hene.dev

Rails で、関連付けを行ったモデルを呼び出せなかったとき

Rails で、関連付けを行ったモデルを呼び出せなかったとき

ShopReserve が、 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
=> []

参考

関連記事