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

时间:2015-09-02 19:40:02

标签: ruby-on-rails search ransack

我正在尝试使用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')

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用order byfield功能。

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

其中3是商家角色ID,2是特权,1是常规。这种方法的问题在于您正在对ID进行硬编码。这种方法可以通过几种方式扩展,这只是一个起点。

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

的使用