リンク内容
こちらの記事を参考にアプリに通知機能を導入しようとしているのですが、いいねボタンを押した際に
ActiveRecord::StatementInvalid in FavoritesController#create SQLite3::SQLException: no such table: main.visiteds: INSERT INTO "notifications" ("visitor_id", "visited_id", "micropost_id", "action", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?)
といったような、visitedsというようなテーブルはないと言われます。visited_idというカラムがnotificationモデルにあるのですが、何故かここでそのカラムが挙げられていて困惑しています。この場合どのようなことが原因として考えられるのでしょうか。
試したこと
・tableの作り直し
・サーバーの再起動
・コマンドでインスタンスの生成を試みましたが
pry(main)> user.active_notifications.create(visited_id: 2, micropost_id: 116, action: 'like') ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: main.visiteds: INSERT INTO "notifications" ("visitor_id", "visited_id", "micropost_id", "action", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?) from /Users/ryoga_h/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/database.rb:147:in `initialize' Caused by SQLite3::SQLException: no such table: main.visiteds from /Users/ryoga_h/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/database.rb:147:in `initialize'
と、こちらでもvisitedsテーブルが見つからないと表示されます。
notificationsテーブル
create_table "notifications", force: :cascade do |t| t.integer "visitor_id", null: false t.integer "visited_id", null: false t.integer "micropost_id" t.integer "comment_id" t.string "action", null: false t.boolean "checked", default: false, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["comment_id"], name: "index_notifications_on_comment_id" t.index ["micropost_id"], name: "index_notifications_on_micropost_id" t.index ["visited_id"], name: "index_notifications_on_visited_id" t.index ["visitor_id"], name: "index_notifications_on_visitor_id" end
micropost.rb
def create_notification_like!(current_user) # すでに「いいね」されているか検索 temp = Notification.where(["visitor_id = ? and visited_id = ? and micropost_id = ? and action = ? ", current_user.id, user_id, id, 'like']) # いいねされていない場合のみ、通知レコードを作成 if temp.blank? notification = current_user.active_notifications.build( micropost_id: id, visited_id: user_id, action: 'like' ) # 自分の投稿に対するいいねの場合は、通知済みとする if notification.visitor_id == notification.visited_id notification.checked = true end notification.save if notification.valid? end end
favoritesコントローラ
def create @micropost = Micropost.find(params[:micropost_id]) current_user.like(@micropost) redirect_back(fallback_location: root_url) @micropost.create_notification_like!(current_user) end
Notification.rb
class Notification < ApplicationRecord default_scope -> { order(created_at: :desc) } belongs_to :visitor, class_name: "User", foreign_key: "visitor_id", optional: true belongs_to :visited, class_name: "User", foreign_key: "visited_id", optional: true belongs_to :micropost, optional: true belongs_to :comment, optional: true end
User.rb
has_many :active_notifications, class_name: 'Notification', foreign_key: 'visitor_id', dependent: :destroy has_many :passive_notifications, class_name: 'Notification', foreign_key: 'visited_id', dependent: :destroy
マイグレーション
class CreateNotifications < ActiveRecord::Migration[5.1] def change create_table :notifications do |t| t.references :visitor, foreign_key: true, null: false t.references :visited, foreign_key: true, null: false t.references :micropost, foreign_key: true t.references :comment, foreign_key: true t.string :action, null: false t.boolean :checked, default: false, null: false t.timestamps end # rails5.0以降はt.referencesでindexが自動生成される end end
optinoal:trueを外した後
[16] pry(main)> a = user.active_notifications.create!(action:'like', micropost_id: 100,visited_id: 4) (0.1ms) begin transaction User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 4], ["LIMIT", 1]] (0.1ms) rollback transaction ActiveRecord::RecordInvalid: Validation failed: Miropost must exist, Comment must exist from /Users/ryoga_h/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord-5.1.7/lib/active_record/validations.rb:78:in `raise_validation_error'
学習の身で自己解決力も乏しく自分では解決することができませんでした。どなたかご教授頂けると嬉しいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/29 06:34
2020/07/29 09:52
2020/07/29 10:13
2020/07/29 10:15
2020/07/29 10:19
2020/07/29 11:59
2020/07/29 20:27
2020/07/31 07:20
2020/07/31 07:47
2020/07/31 08:02