简体   繁体   中英

order active_admin column by parent item in belongs_to relationship

I have two models: show_request and show . A show_Request belongs_to a show and a show has_many show_requests . On the show_request page in active_admin, I want to order show_requests by the show 's created_at value. Here is my code so far:

ActiveAdmin.register ShowRequest do

  controller do
    def scoped_collection
      end_of_association_chain.includes(:show)
      #I also tried ShowRequest.includes(:show)
    end
  end

  index do
    column 'Show', sortable: "shows.created_at_asc" do |show_req|
        link_to show_req.show.name, admin_show_path(show_req.show)
    end
  end

end

Here are the server logs:

Started GET "/admin/show_requests" for 127.0.0.1 at 2015-09-18 09:35:36 -0400
Processing by Admin::ShowRequestsController#index as HTML
  AdminUser Load (0.3ms)  SELECT  "admin_users".* FROM "admin_users"  WHERE "admin_users"."id" = 1  ORDER BY "admin_users"."id" ASC LIMIT 1
   (1.2ms)  SELECT COUNT(*) FROM "show_requests"  WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't')
   (0.2ms)  SELECT COUNT(*) FROM "show_requests"
   (0.2ms)  SELECT COUNT(*) FROM "show_requests"  WHERE (not_going_to_show = 't' AND i_want_my_horse_to_compete = 'f')
   (0.3ms)  SELECT COUNT(count_column) FROM (SELECT  1 AS count_column FROM "show_requests"  WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't') LIMIT 30 OFFSET 0) subquery_for_count
  CACHE (0.0ms)  SELECT COUNT(count_column) FROM (SELECT  1 AS count_column FROM "show_requests"  WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't') LIMIT 30 OFFSET 0) subquery_for_count
  CACHE (0.0ms)  SELECT COUNT(*) FROM "show_requests"  WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't')
  CACHE (0.0ms)  SELECT COUNT(count_column) FROM (SELECT  1 AS count_column FROM "show_requests"  WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't') LIMIT 30 OFFSET 0) subquery_for_count
  ShowRequest Load (2.0ms)  SELECT  "show_requests".* FROM "show_requests"  WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't')  ORDER BY "show_requests"."id" desc LIMIT 30 OFFSET 0
  Show Load (9.7ms)  SELECT "shows".* FROM "shows"  WHERE "shows"."id" IN (2, 1)
  User Load (0.4ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 2]]
  User Load (0.2ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  CACHE (0.0ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  Show Load (0.2ms)  SELECT "shows".* FROM "shows"
  User Load (0.2ms)  SELECT "users".* FROM "users"

This is not working. It is not affecting the order of the columns at all. How do I fix this?

Take a look at this part of the log:

ShowRequest Load (2.0ms)  SELECT  "show_requests".* FROM "show_requests"  WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't')  ORDER BY "show_requests"."id" desc LIMIT 30 OFFSET 0
Show Load (9.7ms)  SELECT "shows".* FROM "shows"  WHERE "shows"."id" IN (2, 1)

You can see that the ShowRequest s and Show s are loaded in separate queries. sortable is not going to work here, because you can't order one table by a field of another without a join. The fix should be to tell ActiveRecord that you need to reference the shows table in your query:

controller do
  def scoped_collection
    super.includes(:show).references(:shows)
  end
end

index do
  column :show, sortable: 'shows.created_at'
end

references only works with includes , and forces Rails to perform a join when eager loading.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM