【问题标题】:How to target a model and access records nested two levels deep in Ruby on Rails?如何定位模型并访问嵌套在 Ruby on Rails 中两层深处的记录?
【发布时间】:2016-09-03 09:01:04
【问题描述】:

我正在尝试在 ruby​​ on rails 中创建一个待办事项列表应用程序,该应用程序具有 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 返回用户的待办事项列表。

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

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

但是

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

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

我们尝试了@user.todo_lists.map(&:todo_items).flatten,它为用户返回所有待办事项,但我们无法添加.completed 范围。

我走对了吗?

【问题讨论】:

  • 您对@Deepak 和@slehmann36 有什么看法?

标签: ruby-on-rails ruby activerecord models


【解决方案1】:

尝试使用 has_many :through 关联。

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

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

【讨论】:

    【解决方案2】:

    您遇到了这些错误

    1-

    @user.todo_lists.todo_items
    
    NoMethodError: undefined method 'todo_items'. 
    

    试试

    @user.todo_lists
    

    这将返回活动记录数组或 nil,但如果你将得到 nil,那么你将错误未定义的方法“todo_items”。对于零类

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

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

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

    @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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2014-07-15
      • 1970-01-01
      • 2011-01-11
      相关资源
      最近更新 更多