Сортировка Rails-ассоциаций с Ransack

первый раз постер. Я пытаюсь сортировать таблицу пользователей, используя драгоценный камень Ransack и Kaminari для разбивки на страницы. Когда я использую сортировку имени, id и т.д., Но когда я пытаюсь установить связь с posts_count, сортировка прерываний и не будет работать. Примечание: в представлении "u.posts.count" работает правильно. Я пробовал пользовательские области в модели пользователей и создавал настраиваемые объекты для параметров поиска, но ничего не работает. Я думаю, что у меня возникают проблемы либо в области по умолчанию, либо в объекте @search, не имеющем данных. Нужна помощь!

Вот некоторые соответствующие фрагменты:

модели /user.rb

  has_many :posts, :dependent => :destroy 

модели /post.rb

  belongs_to :user 

  default_scope :order => 'post.created_at DESC'

Контроллеры /users _controller.rb

  def index
    @title = "User Index"
    @search = User.search(params[:q]) # Ransack
    @total_users = User.all.count
    # .per(10) is the per page for pagination (Kaminari).
    @users = @search.result.order("updated_at DESC").page(params[:page]).per(10) #This displays the users that are in the search criteria, paginated.
  end

просмотров/пользователей/index.html.erb

  ..
  <%= sort_link @search, :posts_count, "No. of Posts" %> #Sort links at column headers
  .. 
  <% @users.each do |u| %> #Display everything in the table
    <%= u.posts.count %>
  <% end %>

Ответ 1

Вы можете добавить область в свою модель User:

def self.with_posts
  joins(:posts).group('posts.id').select('users.*, count(posts.id) as posts_count')
end

и используйте его следующим образом:

@search = User.with_posts.search(params[:q]) # Ransack

тогда вы можете рассматривать posts_count как любой другой атрибут.

Ответ 2

Я нашел решение:

Контроллер:

def index
    sql = "users.*, (select count(posts.id) from posts\
    where posts.user_id = users.id) as count"
    @search = User.select(sql).search(params[:q])

    if params[:q] && params[:q][:s].include?('count')
      @users = @search.result.order(params[:q][:s])
    else
      @users = @search.result
    end
    .......
end

Вид:

<th><%= sort_link @search, :count, "posts count" %></th>