gpt4 book ai didi

ruby-on-rails - 模型设计 : Users have friends which are users

转载 作者:行者123 更新时间:2023-12-04 16:51:49 25 4
gpt4 key购买 nike

在追求这种关联之前,我希望确保我的方法是正确的。实现听起来太复杂了,所以我想我的计划肯定有问题。我正在使用结构化 (SQL) 数据存储,符合 Rails 存储约定。我有一个用户模型,它有一个电子邮件地址,password_digest , 和 Schema 中的名称。

class User < ActiveRecord::Base
has_many :posts
end

我想实现一个 has_many关联到好友收藏,让用户可以 belong_to用户(作为 friend )。我希望能够拥有 User.last.friends.last正确构建和填充后返回 User 对象。

我相信我可以为这个关联创建一个模型,例如:
Class Friend < ActiveRecord::Base
belongs_to :user
belongs_to :friendlies, class: 'User'
end
Class User < ActiveRecord::Base
has_many :posts
has_many :friends
has_many :friendly, class: 'Friend'
end

但我认为这需要我在模型中添加一个 as 并使用 User.last.friends.last.user 进行查询。所以我在想这是一个 has_and_belongs_to_many关系。我可以摆脱以下(或类似的东西):
class User < ActiveRecord::Base
has_and_belongs_to_many :friends, class: 'User'
end

我找到了 this :
class User < ActiveRecord::Base
has_many :user_friendships
has_many :friends, through: :user_friendships


class UserFriendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, class_name: 'User', foreign_key: 'friend_id'

this (自称“标准”):
has_many :friendships, :dependent => :destroy
has_many :friends, :through => :friendships, :dependent => :destroy
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id", :dependent => :destroy
has_many :inverse_friends, :through => :inverse_friendships, :source => :user, :dependent => :destroy

我认为这需要一个 Friendship模型。我不觉得我需要一个友谊模型。我认为 class UserFriendship方法看起来不错,但它需要一个额外的模型。现在进入问题:
  • 我可以做一个 has_and_belongs_to_many与将用户与作为用户的 friend 相关联的表的关系,而不需要额外的模型来这样做?
  • 有一个额外的模型“以防”以后出现额外的要求是否谨慎?
  • 最佳答案

    您正在寻找的是一种叫做 self referential join 的东西。 ,这意味着您可以引用相同的 model具有不同的关联:

    #app/models/user.rb
    class User < ActiveRecord::Base
    has_and_belongs_to_many :friendships,
    class_name: "User",
    join_table: :friendships,
    foreign_key: :user_id,
    association_foreign_key: :friend_user_id
    end

    您必须创建一个 habtm连接表有一个引用:
    $ rails g migration CreateFriendshipsTable

    #db/migrate/create_friendships_table____.rb
    class CreateFriendShipsTable < ActiveRecord::Migration
    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

    $ rake db:migrate

    这里有一个很好的引用: Rails: self join scheme with has_and_belongs_to_many?

    Is it prudent to have an additional model 'in case' additional requirements pop up later?



    只有当你知道你会有额外的属性时。如果没有,您可以使用 habtm只要你愿意。

    关于ruby-on-rails - 模型设计 : Users have friends which are users,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34208348/

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