質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

714閲覧

rails console でのフォロー/アンフォロー

iwashita

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/06/06 16:45

プログラミング初心者で、現在フォロー機能の実装を初めて行っています。

テキストに従って必要なファイルを作成し、rails consoleでユーザー同士のフォロー/アンフォローを行ってみようと思ったところ、下記のようになってしまいました。

本来であれば、「user1がuser2をフォローしている」はずなので「true」と表示されなければならないはずなのですが、直前の「user1をフォローしている人たちを取得」した際にはuser2が出てきたにも関わらず、「false」となってしまいます。

rails consoleを行うまでに、フォロー機能のために作成したファイル、追加したコードの確認を行ったのですが、間違えを見つけることはできず、原因に見当がつかない為、こちらにてご相談させて頂こうと思いました。

こちらがrails console実行結果です。

ec2-user:~/environment/microposts (master) $ rails c Running via Spring preloader in process 9318 Loading development environment (Rails 5.2.4.3) 2.5.3 :001 > User.all (0.3ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 User Load (0.3ms) SELECT `users`.* FROM `users` LIMIT 11 => #<ActiveRecord::Relation [#<User id: 1, name: "user1", email: "user1@example.com", password_digest: "$2a$12$.Hvz5cakMeCIl5wXz.s0h.P.FOT54evSaauXEBkxn.B...", created_at: "2020-06-06 16:04:08", updated_at: "2020-06-06 16:04:08">, #<User id: 2, name: "user2", email: "user2@example.com", password_digest: "$2a$12$8AsGo92HzcjkwlK79TRgM.elszFUnVEYih05A3/W7EI...", created_at: "2020-06-06 16:04:40", updated_at: "2020-06-06 16:04:40">]> 2.5.3 :002 > user1 = User.find(1) User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 => #<User id: 1, name: "user1", email: "user1@example.com", password_digest: "$2a$12$.Hvz5cakMeCIl5wXz.s0h.P.FOT54evSaauXEBkxn.B...", created_at: "2020-06-06 16:04:08", updated_at: "2020-06-06 16:04:08"> 2.5.3 :003 > user2 = User.find(2) User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1 => #<User id: 2, name: "user2", email: "user2@example.com", password_digest: "$2a$12$8AsGo92HzcjkwlK79TRgM.elszFUnVEYih05A3/W7EI...", created_at: "2020-06-06 16:04:40", updated_at: "2020-06-06 16:04:40"> 2.5.3 :004 > user1.follow(user2) Relationship Load (0.2ms) SELECT `relationships`.* FROM `relationships` WHERE `relationships`.`user_id` = 1 AND `relationships`.`follow_id` = 2 LIMIT 1 => #<Relationship id: 1, user_id: 1, follow_id: 2, created_at: "2020-06-06 16:13:55", updated_at: "2020-06-06 16:13:55"> 2.5.3 :005 > user1.reload User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 => #<User id: 1, name: "user1", email: "user1@example.com", password_digest: "$2a$12$.Hvz5cakMeCIl5wXz.s0h.P.FOT54evSaauXEBkxn.B...", created_at: "2020-06-06 16:04:08", updated_at: "2020-06-06 16:04:08"> 2.5.3 :006 > user1.followings User Load (0.4ms) SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`follow_id` WHERE `relationships`.`user_id` = 1 LIMIT 11 => #<ActiveRecord::Associations::CollectionProxy [#<User id: 2, name: "user2", email: "user2@example.com", password_digest: "$2a$12$8AsGo92HzcjkwlK79TRgM.elszFUnVEYih05A3/W7EI...", created_at: "2020-06-06 16:04:40", updated_at: "2020-06-06 16:04:40">]> 2.5.3 :007 > user1.following?(user2) User Exists (0.7ms) SELECT 1 AS one FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`user_id` WHERE `relationships`.`follow_id` = 1 AND `users`.`id` = 2 LIMIT 1 => false

フォロー機能作成のために作ったファイル、追加したコードも下記に載せさせてもらいます。

db/migrate

class CreateRelationships < ActiveRecord::Migration[5.2] def change create_table :relationships do |t| t.references :user, foreign_key: true t.references :follow, foreign_key: { to_table: :users } t.timestamps t.index [:user_id, :follow_id], unique: true end end end

models/relationship.rb

class Relationship < ApplicationRecord belongs_to :user belongs_to :follow, class_name: 'User' end

models/user.rb

class User < ApplicationRecord before_save { self.email.downcase! } validates :name, presence: true, length: { maximum: 50 } validates :email, presence: true, length: { maximum: 255 }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i}, uniqueness: { case_sensitive: false } has_secure_password has_many :microposts has_many :relationships has_many :followings, through: :relationships, source: :follow has_many :reverses_of_relationship, class_name: 'Relationship', foreign_key: 'follow_id' has_many :followers, through: :reverses_of_relationship, source: :user def follow(other_user) unless self == other_user self.relationships.find_or_create_by(follow_id: other_user.id) end end def unfollow(other_user) relationship = self.relationships.find_by(follow_id: other_user.id) relationship.destroy if relationship end def following?(other_user) self.followers.include?(other_user) end end

railsは5.2.2を使用しています。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

def following?(other_user) self.followings.include?(other_user) end

こちらのコードを訂正したところ動作しました。

投稿2020/06/07 02:28

iwashita

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問