前提・実現したいこと
Ruby on Railsで、ねこ特化型のインスタグラムのようなアプリを作っています。
User <- relationships経由 -> Cat <- cat_photos経由 -> Photo
というアソシエーションを組んでいます。
ユーザーがフォローしているねこたちの写真一覧表示機能を実装中に、以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
ActiveRecord::StatementInvalid in Cats#index Showing /Users/username/projects/nyanstagram/app/views/cats/index.html.erb where line #9 raised: Mysql2::Error: Unknown column 'photos.cat_ids' in 'IN/ALL/ANY subquery' Extracted source (around line #9): 7 8 9 10 11 12 <h4 class="text-center">FOLLOWING'S NEW PHOTOS</h4> </div> <% if @following_cats_photos.present? %> <div class="row d-flex justify-content-around"> <% @following_cats_photos.each do |photo| %> <div class="col-sm-4 mb-3"> Rails.root: /Users/username/projects/nyanstagram Application Trace | Framework Trace | Full Trace app/views/cats/index.html.erb:9 Request Parameters: None
該当のソースコード
Ruby
1//Catsコントローラー 2 3 def index 4 @photos = Photo.includes(:cats).order('created_at DESC').limit(6) 5 @cats = Cat.order('created_at DESC').limit(6) 6 if user_signed_in? && current_user.following.present? 7 @user = User.includes(:following).find(current_user.id) 8 @following_cats = @user.following 9 @following_cats_photos = Photo.where(cat_ids: @following_cats).order('created_at DESC').limit(6) 10 end 11 end
HTML
1//該当ページHTML 2<!--新着写真(フォロー)--> 3<% if @following_cats.present? %> 4 <div class="container mt-5"> 5 <div class="row mt-5 pt-4 mb-5 d-inline"> 6 <h4 class="text-center">FOLLOWING'S NEW PHOTOS</h4> 7 </div> 8 <% if @following_cats_photos.present? %> 9 <div class="row d-flex justify-content-around"> 10 <% @following_cats_photos.each do |photo| %> 11 <div class="col-sm-4 mb-3"> 12 <div class="card border-0"> 13 <%= link_to photo_path(photo) do %> 14 <%= image_tag photo.cat_photo, class: "card-img-top" %> 15 <% end %> 16 <div class="d-flex flex-row justify-content-between p-2"> 17 <h6 class="card-title"><%= photo.detail %></h6> 18 <div class="like-btn card-text"> 19 <%= render 'likes/like', photo: photo %> 20 </div> 21 </div> 22 </div> 23 </div> 24 <% end %> 25 </div> 26 <% else %> 27 <div class="text-center"> 28 <p>フォローしているねこちゃんはまだ写真が投稿されていないみたいです。</p> 29 </div> 30 <% end %> 31 </div> 32<% end %>
Ruby
1//Userモデル 2class User < ApplicationRecord 3 # Include default devise modules. Others available are: 4 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 5 devise :database_authenticatable, :registerable, 6 :recoverable, :rememberable, :validatable 7 8 has_many :cats, dependent: :destroy 9 has_many :photos, dependent: :destroy 10 11 # フォロー関連 12 has_many :relationships 13 has_many :following, through: :relationships, source: :cat 14end
Ruby
1 2//Catモデル 3 4class Cat < ApplicationRecord 5 has_many :cat_photos, dependent: :destroy 6 has_many :photos, through: :cat_photos 7 belongs_to :user 8 has_one_attached :icon 9 以下略
Ruby
1//Photoモデル 2class Photo < ApplicationRecord 3 has_many :cat_photos, dependent: :destroy 4 has_many :cats, through: :cat_photos 5 has_one_attached :cat_photo 6 belongs_to :user 7 以下略
Ruby
1//Cat_Photo中間テーブル 2class CatPhoto < ApplicationRecord 3 belongs_to :cat 4 belongs_to :photo 5end
Ruby
1//フォロー用User_Cat中間モデル 2class Relationship < ApplicationRecord 3 belongs_to :user 4 belongs_to :cat 5 6 with_options presence: true do 7 validates :user_id, :cat_id 8 end 9end
Ruby
1//Catモデルマイグレーション 2 3class CreateCats < ActiveRecord::Migration[6.0] 4 def change 5 create_table :cats do |t| 6 t.string :cat_name, null: false 7 t.integer :cat_sex_id 8 t.integer :cat_age 9 t.integer :cat_breed_id 10 t.timestamps 11 end 12 end 13end 14 15//追記 16class AddUserIdToCats < ActiveRecord::Migration[6.0] 17 def change 18 add_reference :cats, :user, null: false, foreign_key: true 19 end 20end 21
Ruby
1//Photoモデルマイグレーション 2class CreatePhotos < ActiveRecord::Migration[6.0] 3 def change 4 create_table :photos do |t| 5 t.text :detail 6 t.timestamps 7 end 8 end 9end 10//追記 11class AddReferencesToPhotos < ActiveRecord::Migration[6.0] 12 def change 13 add_reference :photos, :user, null: false, foreign_key: true 14 end 15end 16
Ruby
1Cat-Photo中間テーブルマイグレーション 2 3class CreateCatPhotos < ActiveRecord::Migration[6.0] 4 def change 5 create_table :cat_photos do |t| 6 t.references :cat, null: false, foreign_key: true 7 t.references :photo, null: false, foreign_key: true 8 t.timestamps 9 end 10 end 11end
Ruby
1User-Catフォロー関係用テーブルマイグレーション 2 3class CreateRelationships < ActiveRecord::Migration[6.0] 4 def change 5 create_table :relationships do |t| 6 t.references :user, foreign_key: true 7 t.references :cat, foreign_key: true 8 9 t.timestamps 10 11 t.index %i[user_id cat_id], unique: true 12 end 13 end 14end
試したこと
Catsコントローラー内@following_cats_photos = Photo.where(cat_ids: @following_cats).order('created_at DESC').limit(6)
を@following_cats_photos = Photo.where(cats: @following_cats).order('created_at DESC').limit(6)
に変えてみました。
写真が表示されるようになりましたが、cat_idではなくphoto_idを参照しているようで、フォロー関係ではない猫の写真が出てしまいました。
中間テーブルのアソシエーションがうまくいってないのではないかと思いますが、@photo.catsなどで猫情報を引き出すこと、またその逆の@cat.photosで写真を引き出すことは可能でした。
補足情報(FW/ツールのバージョンなど)
Ruby 2.6.5
Rails 6.0.3.6
回答1件
あなたの回答
tips
プレビュー