Active Recordでメソッドチェインをするとエラーになりました。どうしてでしょうか
テーブルの構造は以下です。
mysql> desc school; +--------------------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------------+---------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | area_id | int(11) | NO | | NULL | | | is_display | tinyint(1) | NO | | NULL | | +--------------------+---------------+------+-----+---------+----------------+
モデルのクラスは以下で、scopeを設定しております。
ruby
1class School < ActiveRecord::Base 2 3 scope :display, -> { where(is_display: true) } 4 scope :kansai, -> { where(area_id: [1, 2, 3] ) } 5 6end
下記ですと、データは取得できますが、
> School.kansai => #<ActiveRecord::Relation [#<School id: 1, name: "青葉小学校"
> School.display => #<ActiveRecord::Relation [#<School id: 646, name: "上町小学校"
> School.display.kansai => #<ActiveRecord::Relation [#<School id: 705, name: "長浜小学校"
下記ですと、失敗します。
> School.kansai.display #<School::ActiveRecord_Relation:0x005599a2a56888>=> nil
どうしてでしょうか。
Subdivisionは何者でしょうか?
すいません。コピペミスです。修正しました。
Railsのバージョンはいくつですか?
バージョンは、'4.2.6' になります。
School.display.kansai.to_sqlとSchool.kansai.display.to_sqlの結果はそれぞれどのようになりますか?
この様になります。
```
> School.display.kansai.to_sql
=> "SELECT `school`.* FROM `schools` WHERE `schools`.`is_display ` = 1 AND `schools `.`area_id` IN (1, 2, 3)"
> School.kansai.display.to_sql
#<School::ActiveRecord_Relation:0x00563a87f5f8a8>NoMethodError: undefined method `to_sql' for nil:NilClass
```
scope以外にkansaiやdisplayの定義が存在したりはしませんか?
ruby に Object#display が存在しますね。
クラスメソッドとして呼び出した場合はscopeで定義した方が呼び出されるが、
リレーションのメソッドを呼び出すとObject#displayが呼ばれてるようです。
ちなみに rails6.0.3では再現できませんでした。
なるほどです!
ありがとうございます!
回答1件
あなたの回答
tips
プレビュー