【问题标题】:Creating methods that follow/unfollow other models in rails在 Rails 中创建跟随/取消关注其他模型的方法
【发布时间】:2025-12-05 01:30:01
【问题描述】:

我有一个用户可以关注多个名人的关系设置。

class User < ActiveRecord::Base
  has_many :followings, :dependent => :destroy
  has_many :celebrities, :through => :following
end

class Following < ActiveRecord::Base
  belongs_to :user
  belongs_to :celebrity
end

class Celebrity < ActiveRecord::Base
  has_many :followings, :dependent => :destroy
  has_many :users, :through => :following
end

我想做的是创建允许用户执行以下操作的方法:关注/取消关注名人,指明用户是否关注名人。同样在用户模型中,我想显示他们关注的名人列表,在名人模型中显示关注他们的用户。我已经尝试为前两种方法这样做,但不是 100% 确定如何编写其余的方法。

class User < ActiveRecord::Base
  ...
  def follow(celebrity)
    followings.create(celebrity_id: celebrity.id)
  end

  def unfollow(celebrity)
    followings.find_by(celebrity_id: celebrity.id).destroy
  end

  def following?(celebrity)
  end

  def follows
  end
end

class Celebrity < ActiveRecord::Base
  def followers
  end
end

我在正确的轨道上吗?此外,确保用户只能关注名人一次以防止创建额外的 followings 实例的最佳方法是什么?

【问题讨论】:

  • 你做错了,关注和取消关注操作不应该在用户模型中,而是在 users_controller 中。
  • 我试图按照本教程中的操作方式进行操作(他在连接表的控制器中使用了这两种方法:railstutorial.org/book/following_users
  • 当然,你应该在控制器中做,而不是在模型中!

标签: ruby-on-rails activerecord model associations jointable


【解决方案1】:

要验证用户只能关注一位名人,您可以在关注模型中添加 uniq 验证,例如

class Following < ActiveRecord::Base
  belongs_to :user
  belongs_to :celebrity

  validates :celebrity_id, uniqueness: { scope: :user_id }
end


class User < ActiveRecord::Base
  has_many :followings
  has_many :celebrities, through: :followings

  def follow(celebrity)
    followings.create(celebrity_id: celebrity.id)
  end

  def unfollow(celebrity)
    followings.find_by(celebrity_id: celebrity.id).destroy
  end

  def following?(celebrity)
    celebrity.followers.find_by(id: id).present?
  end

  def follows
    celebrities
  end
end

class Celebrity < ActiveRecord::Base
  has_many :followings
  has_many :users, through: :followings

  def followers
    users
  end
end

并且不要忘记在数据库中添加 uniq 索引

【讨论】:

  • 你会不会碰巧知道如何正确编写两个模型中的其他三个方法?
  • 加了一些代码,其实就是一个简单的has_many through relation。
  • 谢谢。在尝试您的解决方案时,我注意到了两件事。第一个是我需要在follow 方法中添加bang 以使其在控制台中工作。此外,“以下?”方法不起作用。这是错误消息:ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: users.user_id'.
  • 我不确定 bang 是否必要,它只是专注于开发人员的风格偏好,该方法会改变其对象。我已经解决了以下问题?方法,看看。如果我的回答对您有所帮助 - 请随时将其标记为已接受(分数附近的绿色复选标记):)
  • @StanislavMekhonoshin,你为什么要关注和取消关注实例方法?他们应该在 users_controller 中?