我一直在尝试实现一个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):1user.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)
endfriendship.rb
belongs_to :user
belongs_to :friend, class_name: 'User', foreign_key: "friend_id"
validates :user_id, presence: true
validates :friend_id, presence: true我在用Devise进行认证。
发布于 2017-10-14 16:11:10
你不是在建立朋友(另一个用户已经存在),而是建立友谊。
user.rb
class User < ActiveRecord::Base
has_many :friendships, dependent: :destroy
has_many :friends, through: :friendships, source: :friend
endfriendship.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)发布于 2019-03-07 17:15:04
我创建了两个表,名为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.friendshttps://stackoverflow.com/questions/46746092
复制相似问题