如何定位模型并访问 Rails 上 Ruby 嵌套两层的记录?
How to target a model and access records nested two levels deep in Ruby on Rails?
我正在尝试在 rails 上的 ruby 中创建一个待办事项列表应用程序,它有 3 个模型作为嵌套资源。
例如:
- 用户:
has_many :todo_lists
- 待办事项列表:
has_many :todo_items
& belongs_to :user
- 待办事项:
belongs_to :todo_list
& scope :completed, -> { where.not(completed_at: nil) }
运行 @user.todo_lists
returns 用户的待办事项列表。
运行 @todo_lists.todo_items
returns 待办列表的待办事项。
运行 @todo_lists.todo_items.completed
returns 待办事项列表中已完成的待办事项。
但是
运行@user.todo_lists.todo_items
returns错误: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)
我正在尝试在 rails 上的 ruby 中创建一个待办事项列表应用程序,它有 3 个模型作为嵌套资源。
例如:
- 用户:
has_many :todo_lists
- 待办事项列表:
has_many :todo_items
&belongs_to :user
- 待办事项:
belongs_to :todo_list
&scope :completed, -> { where.not(completed_at: nil) }
运行 @user.todo_lists
returns 用户的待办事项列表。
运行 @todo_lists.todo_items
returns 待办列表的待办事项。
运行 @todo_lists.todo_items.completed
returns 待办事项列表中已完成的待办事项。
但是
运行@user.todo_lists.todo_items
returns错误: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)