无法通过 Has many 访问属性

Can't access attributes through Has many

试图简化我的模型以显示似乎缺少的重要内容让我知道。

我想通过 @session.owner 访问会话的所有者。所有者与与会者相关联,所有与会者都通过 has_many 与会话相关联。

好像self.attendees没有return任何记录。我确定我遗漏了一些明显的东西。如果您能提供帮助,请提前致谢!

干杯, 泰勒

会话模型

class Session < ApplicationRecord
  has_many :attendees

  def owner
    self.attendees.each do |attendee|
      if attendee.role == "Owner"
        "#{attendee.user_id}"
      end
    end
  end

end

与会者模型

class Attendee < ApplicationRecord
  belongs_to :session

end

在您的情况下,each 将在找到 owner 后继续工作,并将 return nil

class Session < ApplicationRecord
  has_many :attendees

  def owner
    user_id = nil
    self.attendees.each do |attendee|
      if attendee.role == "Owner"
        user_id = "#{attendee.user_id}"
        break
      end
    end

    user_id
  end

end

我已重写您的代码以使用 sql 方法查找 owner

class Session < ApplicationRecord
  has_many :attendees

  def owner
    self.attendees.find_by(role: "Owner").try(:user_id)
  end
end

有几件事很突出。首先,您实现 owner 方法的方式不是很有效,必须查询每条记录并检查角色属性。可以使用 Active Record Association 方法定义关联。例如。您可以在声明关联时定义范围。

为了调查您的问题,即 session.attendees 没有 returning 任何记录,我建议如下:

  1. 验证您是否遵循 rails 约定并具有正确的参考列。 Attendee 应该有 session_id 列。
  2. 编写一些规范,或者至少加载 rails 控制台并通过创建一些测试记录和查看一些记录来验证您的 has_many :attendees 关联是否按预期工作 return编辑。这很可能会揭示您的代码存在的任何问题。

接下来,使用活动记录关联声明您的 "session has owner" 关联。想想你在这里想要什么:应该 session.owner return 与会者记录还是用户记录(在我们的示例中你表示与会者属于用户?)假设 session.owner return 作为参加者记录,您的关联可能如下所示:has_one :owner, -> { where role: 'Owner' }, class_name: 'Attendee'。 (请注意这是一个未经测试的示例)。

有关 has_one 协会的更多信息,请参阅 http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one