我正在尝试使用ransack创建搜索结果。
我已经完成了结果。
用户可以创建文章,每个用户都有角色。
这些角色位于名为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 :(得分: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是商家角色ID,2是特权,1是常规。这种方法的问题在于您正在对ID进行硬编码。这种方法可以通过几种方式扩展,这只是一个起点。
PS:我不熟悉ransack,也不确定上面的代码是否可以正常使用。重点是说明Field()