根据创建文章的用户角色对文章进行排序

Sort articles depending on the users role that created it

我正在尝试使用 ransack 创建搜索结果。

我已经完成了结果。

用户可以创建文章,每个用户都有一个角色。

  1. 常规
  2. 特权
  3. 商家

这些角色在一个名为 UserRole

的 table 中

我想显示搜索结果,优先显示 Merchants 然后是 Privileged,最后是 Regular

文章管理员:

def index
  @users = User.all
  @roles = UserRole.all
  @q = Article.ransack(params[:q])

  # check if no search is made, it will show a blank page with search options only
  if params[:q].blank?
    @q = Article.none.ransack # so you have a ransack search
  else
    @q = Article.ransack params[:q]
  end

  # display results from search
  @articles = @q.result.paginate(page: params[:page], :per_page => 10).order('created_at DESC')
end

index.html.erb

<% @articles.each do |article| %>
  ...
<% end %>

用户架构

create_table "users", force: :cascade do |t|
  t.string   "email",                  default: "",    null: false
  t.string   "encrypted_password",     default: "",    null: false
  t.string   "reset_password_token"
  t.datetime "reset_password_sent_at"
  t.datetime "remember_created_at"
  t.integer  "sign_in_count",          default: 0,     null: false
  t.datetime "current_sign_in_at"
  t.datetime "last_sign_in_at"
  t.inet     "current_sign_in_ip"
  t.inet     "last_sign_in_ip"
  t.string   "confirmation_token"
  t.datetime "confirmed_at"
  t.datetime "confirmation_sent_at"
  t.string   "unconfirmed_email"
  t.datetime "created_at",                             null: false
  t.datetime "updated_at",                             null: false
  t.string   "first_name"
  t.string   "last_name"
  t.string   "phone"
  t.boolean  "admin",                  default: false
  t.integer  "user_role_id",           default: 1
end

user_role 架构

create_table "user_roles", force: :cascade do |t|
  t.string   "role_name"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

问题

如何按 Merchants 然后 Privileged 最后 Regular 的优先顺序显示搜索结果?

编辑

文章架构

create_table "articles", force: :cascade do |t|
  t.string   "name"
  t.float    "price"
  t.string   "description"
  t.datetime "created_at",                 null: false
  t.datetime "updated_at",                 null: false
  t.integer  "user_id"
  t.integer  "category_id"
end

差不多解决了

已更改

-    @articles = @q.result.paginate(page: params[:page], :per_page => 10).order('created_at desc')

+    @articles = @q.result.paginate(page: params[:page], :per_page => 10).joins(:user).order('users.user_role_id desc')

现在它首先显示具有 3 Merchant 角色的用户,当他们创建新文章时,新文章也会显示在顶部,但是如果 1 Regular 用户创建了文章,它会显示在已创建文章的 2 Privileged3 Merchant 用户下方。

但是现在当一个新的普通用户注册时,它会将新文章放在旧文章的下面...

已解决

@articles = @q.result.paginate(page: params[:page], :per_page => 10).joins(:user).order('users.user_role_id desc', 'created_at desc')

('users.user_role_id desc', 'created_at desc')

一种方法是使用带有 field 函数的 order by

@q.result.paginate(page: params[:page], :per_page => 10).joins(:user).order('FIELD(user_role_id,1,2,3) desc')

其中 3 是 Merchant role id ,2 是 Privileged,1 是 Regular。这种方法的问题是您要对 ID 进行硬编码。这种方法可以通过多种方式扩展,这只是一个起点。

PS:我不熟悉 ransack,也不确定上面的代码是否可以正常工作。重点是说明 Field()

的用法