【问题标题】:Nested ActiveRecord access嵌套的 ActiveRecord 访问
【发布时间】:2018-01-15 16:39:23
【问题描述】:

我正在尝试访问我的 Rails 项目中的嵌套 ActiveRecord 数据。
我想访问单个用户的所有子网中的所有设备
我想做这样的事情:

def index
    @user = User.find(params[:user_id])
    @subnets = @user.subnets.all
    @devices = @subnets.each.devices.order(sort_column+' '+sort_direction).search(params[:search])
    respond_to do |format|
      format.html
      format.csv { send_data Device.to_csv(@devices) }
    end
end

但是@subnet.each.devices 部分不起作用。

有没有一种方法可以在不迭代和创建数组的情况下做到这一点,从那以后我就不能再使用 order 函数了。

【问题讨论】:

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


    【解决方案1】:

    尝试使用joins

    @devices = Device.joins(:subnets).where('subnets.user_id = :id', id: @user.id)
    

    【讨论】:

    • 页面加载,我看到了我需要的所有子网,但是一旦我尝试搜索,我得到这个 SQL 错误:SQLite3::SQLException: ambiguous column name: name: SELECT "devices".* FROM "devices" INNER JOIN "subnets" ON "subnets"."id" = "devices"."subnet_id" WHERE (subnets.user_id = 4) AND (name LIKE '%TEST%' OR IP LIKE '%TEST%' OR MAC LIKE '%TEST%') ORDER BY IP asc
    • 我发现了我的错误:D 我的搜索例程使用了... name LIKE ...,但子网和设备确实有名称。所以我把它改成了... devices.name LIKE ...,现在它可以工作了;)
    【解决方案2】:

    试试这个 eager_load

     u = User.eager_load({subnets: :devices}).order('devices.updated_by desc').find(1)
    

    这是我日志中的查询

    SELECT "users"."id" AS t0_r0, "users"."username" AS t0_r1, "users"."created_at" AS t0_r2, "users"."updated_at" AS t0_r3, "users"."company_id" AS t0_r4, "users"."location_id" AS t0_r5, "subnets"."id" AS t1_r0, "subnets"."user_id" AS t1_r1, "devices"."id" AS t2_r0, "devices"."subnets_id" AS t2_r1, "devices"."updated_by" AS t2_r2, "devices"."created_by" AS t2_r3 FROM "users" LEFT OUTER JOIN "subnets" ON "subnets"."user_id" = "users"."id" LEFT OUTER JOIN "devices" ON "devices"."subnets_id" = "subnets"."id" WHERE "users"."id" = ? AND "users"."id" = 1 ORDER BY devices.updated_by desc
    

    在此之后,您可以轻松获得设备 :)

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      相关资源
      最近更新 更多