gpt4 book ai didi

ruby-on-rails - 在 Rails 中使用 has_and_belongs_to_many 实现友谊模型

转载 作者:行者123 更新时间:2023-12-02 20:29:18 26 4
gpt4 key购买 nike

我有用户模型,并且我正在 Rails 上使用 has_and_belongs_to_many 来建立用户和 friend 模型之间的关系。
用户可以有很多 friend , friend 也可以有很多 friend 。我需要获取特定用户的所有好友,我该怎么做?

user.rb文件中:

has_and_belongs_to_many :friendships, class_name: "User", join_table:  :friendships,
foreign_key: :user_id,
association_foreign_key: :friend_user_id}

20180309142447_create_friendships_table.rb文件中:

class CreateFriendshipsTable < ActiveRecord::Migration[5.1]
def change
create_table :friendships, id: false do |t|
t.integer :user_id
t.integer :friend_user_id
end

add_index(:friendships, [:user_id, :friend_user_id], :unique => true)
add_index(:friendships, [:friend_user_id, :user_id], :unique => true)
end
end

我需要获取特定用户的所有好友,我该怎么做?

最佳答案

在两个用户之间建立友谊

我假设您愿意实现像 Facebook 这样的友谊模式:

  1. 用户请求与其他用户建立友谊
  2. 其他人必须接受好友请求
  3. 只有经过这两个步骤,用户才是真正的 friend

为此,我们需要一个友谊模型来替换您的 has_many_and_belongs_to 内置函数。友谊模型将帮助我们识别用户之间活跃的和待处理的友谊请求。友谊模型只有一个用户(发起者)和一个 friend (用户发送请求的人)。

场景:

  1. 您向 Joe 发送请求 -> 创建友谊模型,您是“用户”,joe 是“ friend ”
  2. Joe 接受您的友谊 -> 创建的友谊模型,joe 是“用户”,您是“ friend ”
  3. 通过 2 个辅助函数 active_friendspending_friends,您可以获取 View 或 API 的数据

# new migration
# $ rails g migration create_friendships
def change
create_table :friendships do |t|
t.integer :user_id
t.integer :friend_id
t.timestamps null: false
end
end

创建新的友谊模型

# friendship.rb
class Friendship < ActiveRecord::Base

# - RELATIONS
belongs_to :user
belongs_to :friend, class_name: 'User'

# - VALIDATIONS
validates_presence_of :user_id, :friend_id
validate :user_is_not_equal_friend
validates_uniqueness_of :user_id, scope: [:friend_id]

def is_mutual
self.friend.friends.include?(self.user)
end

private
def user_is_not_equal_friend
errors.add(:friend, "can't be the same as the user") if self.user == self.friend
end

end

在您的用户模型中,您可以像处理友谊 rails 一样

# user.rb
has_many :friendships, dependent: :destroy
has_many :friends, through: :friendships

让别人发送给“你”的友谊

has_many :received_friendships, class_name: 'Friendship', foreign_key: 'friend_id'
has_many :received_friends, through: :received_friendships, source: 'user'

def active_friends
friends.select{ |friend| friend.friends.include?(self) }
end

def pending_friends
friends.select{ |friend| !friend.friends.include?(self) }
end

关于ruby-on-rails - 在 Rails 中使用 has_and_belongs_to_many 实现友谊模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49213989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com