0

我一直在尝试实现一个 Facebook 风格的朋友系统。我已经阅读了几个教程并且无法理解我做错了什么。友谊控制器和视图中用于添加朋友的链接可以工作,但在数据库级别会引发错误。

当我打开 rails 控制台并放置:

User.find(1).friends << User.find(2)

我得到:

SQL (0.4ms)  INSERT INTO "friendships" ("user_id", "friend_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["user_id", 1], ["friend_id", 2], ["created_at", "2017-10-14 15:01:28.364691"], ["updated_at", "2017-10-14 15:01:28.364691"]]
(0.1ms)  rollback transaction
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: main.friends: INSERT INTO "friendships" ("user_id", "friend_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)
from (irb):1

用户.rb

has_many :friendships, dependent: :destroy
has_many :friends, through: :friendships

# these are used in the controller

def befriend(user)
  friends << user
end

def unfriend(user)
  friends.delete(user)
end

def friends?(user)
  friends.include?(user)
end

友谊.rb

belongs_to :user
belongs_to :friend, class_name: 'User', foreign_key: "friend_id"

validates :user_id, presence: true
validates :friend_id, presence: true

我正在使用设计进行身份验证。

4

2 回答 2

0

我创建了两个名为 User 和 Friendship 的表

> rails g model User first_name:string last_name:string
> rails g model Friendship user:references friend:references
> rake db:migrate

user.db中,定义了两个 has_many 关联:

class User < ApplicationRecord
    has_many :friendships, dependent: :destroy
    has_many :friends, through: :friendships
end

friendship.rb中:

class Friendship < ApplicationRecord
   belongs_to :user
   belongs_to :friend, class_name: 'User'
end

在 Rails 控制台中,我创建了两个示例用户并让他们成为朋友:

> User.create(first_name:"Blue", last_name:"Sky")
> User.create(first_name:"White", last_name:"Cloud")
> Friendship.create(user:User.first, friend:User.second)
> Friendship.create(user:User.second, friend:User.first)

或者:

> User.first.friendships.create(friend:User.second)
> User.second.friendships.create(friend:User.first)

现在您可以检索属于一个用户的所有朋友。例如:

> User.first.friends
于 2019-03-07T17:15:04.803 回答
0

您不是在创建朋友(其他用户已经存在),而是Friendships

用户.rb

class User < ActiveRecord::Base
  has_many :friendships, dependent: :destroy
  has_many :friends, through: :friendships, source: :friend
end

友谊.rb

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, class_name: 'User'
end

安慰

User.find(1).friendship.create(friend_id: User.find(2).id)
于 2017-10-14T16:11:10.453 回答