【问题标题】:Sort articles depending on the users role that created it根据创建文章的用户角色对文章进行排序
【发布时间】:2015-09-02 19:40:01
【问题描述】:

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

我已经完成了结果。

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

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

这些角色位于名为UserRole的表中

我想显示搜索结果的优先顺序是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')

【问题讨论】:

  • article 模型的架构是什么?
  • 对不起,我添加了文章架构

标签: ruby-on-rails search ransack


【解决方案1】:

一种方法是使用order byfield 函数。

@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()的用法

【讨论】:

  • 嗨,我必须用什么替换Field 吗?我得到了@articles = @q.result.paginate(page: params[:page], :per_page =&gt; 10).order('user_id(user_role_id,1,2,3) desc'),但它一直说column "user_role_id" does not exist。我在问题中添加了Articles 架构
  • 知道了,我忘了添加joins 并做了一些更改。我所做的只是@articles = @q.result.paginate(page: params[:page], :per_page =&gt; 10).joins(:user).order('users.user_role_id desc')1,2,3 不起作用或者我不明白...谢谢
  • 刚刚发现当你有一个新用户注册时,他们的文章会放在其他人的下面...
  • 抱歉无法回复您的 cmets(时区差异)。很高兴它在这里工作,如果它回答了您的问题,您也可以将其标记为正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
相关资源
最近更新 更多