1. 現象
Rails5 のActiveRecordで join をすると カラムが全てnilになってしまいます。
2. 状況
下記のような実装になっています。
roomsテーブルとstudentsテーブルを定義しています。
roomsテーブルとstudentsテーブルを結合して、studentsのheight一覧を取ろうとしています。
[schema.rb]
Ruby
1ActiveRecord::Schema.define(version: 201808120100) do 2 create_table "rooms", force: :cascade do |t| 3 t.string "name" 4 t.string "teacher_name" 5 t.datetime "created_at", null: false 6 t.datetime "updated_at", null: false 7 end 8 create_table "students", force: :cascade do |t| 9 t.integer "room_id" 10 t.string "name" 11 t.integer "height" 12 t.integer "weight" 13 t.datetime "created_at", null: false 14 t.datetime "updated_at", null: false 15 end 16end
その後、下記のようにモデルを作成しています。
[app/modesl/room.rb]
Ruby
1class Room < ActiveRecord::Base 2 has_many :student 3end
[app/modesl/student.rb]
Ruby
1class Student < ActiveRecord::Base 2 belongs_to :room 3end
モデルにそれぞれリレーションを貼っています。
Controllerで下記のようなレコード取得処理をしたところ、
結果が全てnilになるという状況が発生しており、どのようにjoins文を書けば正しく動くのかご教示願えればと思います。
[app/controllers/test.rb]
Ruby
1def test 2 result = Room.joins(:student).select("students.height") 3 logger.info(result) 4end
3. データ
roomとstudentsにはそれぞれデータが正しく入っていて、存在しないroomに紐づくstudentsやroom_idが空のstudentはいません。(全てのデータが内部結合が可能な状態です)
4. ログ
shell
1DEBUG -- : Room Load (0.1ms) SELECT students.height FROM "rooms" INNER JOIN "students" ON "students"."room_id" = "rooms"."id" LIMIT ? [["LIMIT", 11]] 2INFO -- : #<ActiveRecord::Relation [#<Room id: nil>, #<Room id: nil>, #<Room id: nil>, #<Room id: nil>, #<Room id: nil>, #<Room id: nil>, #<Room id: nil>]> 3INFO -- : Completed 200 OK in 11ms (Views: 0.2ms | ActiveRecord: 1.0ms)
ここで出力されるSQL文をデータベースに直接入力すると、正しくデータが取得できますが、Rails上では、全てがnilとなって出力されます。
Railsのjoins文は表示されたSELECT文を実行しているだけではないのでしょうか?
非常に不可解な動作でしたので、質問させていただきました。
5. その他(環境情報等)
OS: CentOS 7.4
Ruby: ruby 2.3.3p222
Rails: Rails 5.1.4
DB: SQLite3
※studentsテーブル単体でSELECTしろという意見はいりません。話をシンプルにするためにあえてWHERE条件をつけていないだけです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。