如何定位模型并访问 Rails 上 Ruby 嵌套两层的记录?

How to target a model and access records nested two levels deep in Ruby on Rails?

我正在尝试在 rails 上的 ruby 中创建一个待办事项列表应用程序,它有 3 个模型作为嵌套资源。

例如:

运行 @user.todo_lists returns 用户的待办事项列表。

运行 @todo_lists.todo_items returns 待办列表的待办事项。

运行 @todo_lists.todo_items.completed returns 待办事项列表中已完成的待办事项。

但是

运行@user.todo_lists.todo_itemsreturns错误:NoMethodError: undefined method 'todo_items'

运行 @user.todo_lists.todo_items.completed 也 returns 错误:NoMethodError: undefined method 'todo_items'

我们已经尝试 @user.todo_lists.map(&:todo_items).flatten 一个用户的所有待办事项 returns 但我们无法添加 .completed 范围。

我走在正确的轨道上吗?

尝试使用has_many:通过关联。

在您的用户模型中定义关联:

has_many :todo_items, through: :todo_lists

您应该能够在不先获得 todo_lists 的情况下获得 todo_items。

user.todo_items.completed

使用地图你是在正确的轨道上。

user.todo_lists.map { |todo_list| todo_list.todo_items.completed }.flatten

您遇到了这些错误

1-

@user.todo_lists.todo_items

NoMethodError: undefined method 'todo_items'. 

试试

@user.todo_lists

这将 return 您的活动记录数组或 nil,但是如果您将得到 nil,那么您将出错未定义的方法 'todo_items'。对于零 class

现在你得到的结果是数组,所以你不能使用这个方法,所以你可以使用下面的命令

@user.todo_lists.map{|m| {todo_lists: m, todo_items: m.todo_items}}

这将 return 你 todo_lists 在数组中,在 todo_lists 的第一条记录中你将得到 todo_items 的 todo_list。 如果你只想获取待办事项,请使用以下命令

@user.todo_lists.map{|m| m.todo_items}

2-

@user.todo_lists.map(&:todo_items).flatten.completed 

使用命令

@user.todo_lists.map(&:todo_items).flatten.collect(&:completed)