2015-09-02 2 views
0

Я пытаюсь создать результат поиска с помощью ransack.Сортировка статей в зависимости от созданной им роли пользователей

У меня уже есть результаты.

Пользователи могут создавать статьи, и каждый пользователь имеет свою роль.

  1. Regular
  2. Привилегированный
  3. Merchant

Эти роли в таблице называется 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 Privileged и 3 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')

+0

Что такое схема модели 'article'? –

+0

Прошу прощения, я добавил схему статьи –

ответ

1

Один из способов сделать это можно используя order by с field функцией.

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

где 3 является идентификатором роли Merchant, 2 является привилегированным и 1 является регулярным. Проблема с этим подходом заключается в том, что вы жестко кодируете идентификаторы. Этот подход может быть расширен несколькими способами, это только отправная точка.

PS: Я не знаком с ransack и не уверен, что код выше будет работать нормально с ним. Все дело в том, чтобы проиллюстрировать использование Field()

+0

Привет, мне нужно что-то заменить 'Field'? Я получил '@articles = @ q.result.paginate (страница: params [: page],: per_page => 10) .order ('user_id (user_role_id, 1,2,3) desc')', но он продолжает говорить ' Столбец «user_role_id» не существует ». Я добавил схему 'Articles' к вопросу –

+0

, я забыл добавить' joins' и сделал некоторые изменения. Все, что я сделал, это '@articles = @ q.result.paginate (страница: params [: page],: per_page => 10) .joins (: user) .order ('users.user_role_id desc')', но '1 , 2,3' не работает или я этого не понимаю ... Спасибо, –

+0

только что узнал, что когда у вас зарегистрирован новый пользователь, их статьи будут помещены ниже других ... –

Смежные вопросы