无法通过 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 任何记录,我建议如下:
- 验证您是否遵循 rails 约定并具有正确的参考列。
Attendee
应该有 session_id
列。
- 编写一些规范,或者至少加载 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
试图简化我的模型以显示似乎缺少的重要内容让我知道。
我想通过 @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 任何记录,我建议如下:
- 验证您是否遵循 rails 约定并具有正确的参考列。
Attendee
应该有session_id
列。 - 编写一些规范,或者至少加载 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