代码之家  ›  专栏  ›  技术社区  ›  Gerard Simpson

rubyonrails—选择具有匹配id的所有子关联

  •  0
  • Gerard Simpson  · 技术社区  · 6 年前
    • user
    • A 用户 has_many orders .
    • order 你有很多 order_items
    • 订购物品 products 通过 items

    我正在尝试选择所有 那些有 订购物品 product 和我的相配 product_id .

    我是这样处理这个问题的:

    orders = current_user
              .orders
              .current
              .map { |order| order.order_items }
              .flatten
              .select { |order_item| order_item.item_id.to_s == product_id }
              .map { |order_item| order_item.order }
    

    它是有效的,我只是想知道是否有一个更好的或更多的“红宝石方式”来做到这一点?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Carlos Ramirez III    6 年前

    当前编写的代码的主要问题是,大多数查询都是使用Ruby完成的,而不是让数据库通过activerecord来处理。

    map 方法,您让活动记录从数据库返回记录并将它们实例化到内存中。

    使用 joins + where 条款

    查询的关键是利用 连接 把所有的协会和 哪里 把它们过滤成你想要的。

    current_user.orders.joins(:order_items)
    

    从这里你可以使用 哪里 product_id 有问题。

    current_user.orders.joins(:order_items).where(order_items: { item_id: product_id })
    

    这个 子句可以接受 Hash 作为参数,可以使用该散列指定要对联接表进行筛选(在本例中为 order_items


    相关文件如下:
    https://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-the-joined-tables

        2
  •  0
  •   Vishal    6 年前

    使用单个查询而不是长ruby代码获取记录

    current_user.orders.left_outer_joins(order_items: :products).select("orders .* order_items.item_id = #{product_id}").group("orders.id")