【问题标题】:Query a list of records with ActiveRecord where foreign keys of each item are present in a hash使用 ActiveRecord 查询记录列表,其中每个项目的外键都存在于哈希中
【发布时间】:2020-08-08 16:49:53
【问题描述】:

我有四个模型 - 用户、代理、列表和查询。

一个用户 has_one 机构、一个机构 has_many 列表和一个列表 has_many 查询。

我有一个查询,我在哪里得到 :user_id,所以我可以得到它的代理和列表集合。

我需要属于某个Listing的查询。

我的方法如下,显然我正在寻找all 的替代品。我想做一个查询,我可以列出所有查询,其中:listing_id@listings 中的一个列表的ID。

  def index
    @agency = User.find(params[:user_id]).agency
    @listings = @agency.listings

    @inquiries = Inquiry
      .all

    render json: @inquiries
  end

我尝试结合各种selectincludeswhere 等方法,但无法提出可行的解决方案。

感谢您的帮助,非常感谢!

【问题讨论】:

  • 你能展示一些你尝试过的东西吗?这将有助于防止重复工作。

标签: ruby-on-rails ruby postgresql activerecord rails-activerecord


【解决方案1】:

我们可以在单个查询中使用多个连接来达到结果关联。

def index
  @inquiries = Inquiry.joins(listing: { agency: :user }).where(users: { id: params[:user_id] })

 render json: @inquiries
end

【讨论】:

    【解决方案2】:

    首先,如果您使用的是 RuboCop 之类的东西,它可能会警告您通常只在这样的方法中传递一个,可能是两个实例变量。并不是说我没有做过,只是没有考虑到最佳 Rails。也就是说:

    一种方法可能是这样的:

    def index
      @agency = User.find(params[:user_id]).agency
      @listings = @agency.listings
    
      @inquiries = Inquiry.where(listing_id: @listings.pluck(:id))
    
     render json: @inquiries
    end
    

    你可以传递一个数组来匹配wherepluck 为您提供了一个数组,其中包含您传递给它的任何列。

    【讨论】:

    • 如果我需要来自多个表的数据以将实例变量传递给视图,我通常会使用某种连接。
    • 请注意,此解决方案性能不佳(对数据库的 3 次查询)。更喜欢使用“加入”解决方案来进行单个查询。
    • 请注意,这就是我说“不是最佳 Rails”并建议在第一条评论中使用 join 的原因。我确实想表明可以用更具体的东西代替“全部”。我想添加一个连接答案,但不确定他使用的确切语法,因为我已经生锈了。
    • 值得一提的关键字“join”并解释为什么它没有被优化。这就是我评论的目的:-)
    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2019-01-22
    • 2021-12-14
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多