13

第一次海报。我正在尝试使用 Ransack gem 和 Kaminari 对用户表进行排序以进行分页。当我使用名称、ID 等时,排序有效,但当我尝试与posts_count 关联时,排序中断并且不起作用。注意:在视图中,'u.posts.count' 工作正常。我已经在用户模型中尝试了自定义范围,并为搜索参数创建了自定义对象,但似乎没有任何效果。我认为我在默认范围或@search 对象没有数据时遇到了问题。需要帮忙!

以下是一些相关的片段:

模型/用户.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 %>
4

2 回答 2

5

您可以为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像对待任何其他属性一样对待。

于 2012-08-23T07:55:15.390 回答
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>
于 2016-01-09T04:29:01.957 回答