在同一个类中使用has_one和belongs_to进行ruby关联

时间:2016-07-13 00:57:13

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

我尝试创建的状态将包含创建状态的用户和状态所在的用户。

非常类似于"标记"有人在facebook帖子中。我需要创建帖子的用户是所有者,但我还需要找出一种方法将状态所关联的用户与实际状态相关联。

最终目标是显示某个用户的所有状态。

我有一个状态类。

class Status < ApplicationRecord
  belongs_to :user

  validates :content, presence: true,
                      length: { minimum: 2}

  validates :user_id, presence: true
end

我还有一个用户类

class User < ApplicationRecord
  rolify
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  validates :first_name, presence: true

  validates :last_name, presence: true

  validates :profile_name, presence: true, uniqueness: true,
                          format: {
                            with: /\A[a-zA-Z0-9_-]+\z/,
                            message: 'Must be formatted correctly'
                          }

  has_many :statuses
end

我原本想添加

has_one :user

到我的状态类,但我现在意识到这不是最好的实现。

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

用户应该能够创建多个状态并在单个状态下标记多个用户,这是有道理的。因此,您应该使用has_many,而不是has_one

至于使用同一个类创建多个关联:

class Status < ApplicationRecord
  belongs_to :creator, class_name: 'User', foreign_key: 'creator_id'
  has_many :referred_users, through: :mentions, source: :user
end

class Mention < ApplicationRecord
  belongs_to :status
  belongs_to :user
end

class User < ApplicationRecord
  has_many :statuses, foreign_key: 'creator_id'
  has_many :referring_statuses, through: :mentions, source: :status
end

答案 1 :(得分:0)

我不认为在这种情况下,您可以拥有一个直接用户状态模型,因为用户可以拥有许多状态,并且状态可以包含许多用户(创建它的用户,以及用户在状态中标记的用户#39;正确理解它。

我建议您在状态和用户之间创建一个模型,将其命名为Status_Info,并创建一个info属性,该属性表示该记录是为创建者还是已标记的人创建的。

要查找有关用户的所有状态,您只需在Status_Info模型中查找该user_id即可。即Status_Info.where(user_id:wanted_user_id)