无法通过很多来访问属性

时间:2017-02-25 22:52:32

标签: ruby-on-rails has-many

试图愚弄我的模特,以显示重要的东西似乎缺少让我知道。

我尝试在我的视图中通过@session.owner访问会话的所有者。所有者与参与者相关联,并且所有与会者都通过has_many与会话相关联。

似乎self.attendees没有返回任何记录。我确定我错过了一些明显的东西。如果您能提供帮助,请提前致谢!

干杯, 泰勒

会话模型

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

2 个答案:

答案 0 :(得分:1)

在您的情况下,each会在找到owner后继续工作,并会返回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

答案 1 :(得分:1)

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

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

  1. 确认您遵循rails约定并拥有正确的参考列。 Attendee应该有session_id列。
  2. 编写一些规范,或者至少加载rails控制台,并通过创建一些测试记录并查看返回的一些记录来验证您的has_many :attendees关联是否按预期工作。这很可能会揭示您代码的任何问题。
  3. 接下来,使用活动记录关联声明您的“会话拥有者”关联。想想你想要什么:session.owner应该返回与会者记录还是用户记录(在我们的示例中,您指出与会者属于用户?)假设session.owner返回与会者记录,您的关联可能看起来像这样:has_one :owner, -> { where role: 'Owner' }, class_name: 'Attendee'。 (请注意,这是一个未经测试的例子。)

    有关has_one关联的详细信息,请参阅http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one