我有一个模型,用户可以输入多项选择题。我有一个视图,用户可以点击" previous"或" next",它会在数据库中将它们提升1或1。
但是,我想这样做......
一个。用户点击" next",会被带到之前未被查看的新随机问题。
B中。用户点击" prev"会被带到完成的最后一个问题,并在此之前完成最后一个问题。
℃。用户应该有不同的顺序" next"与其他用户相比。
我该怎么做呢?
post.rb
def next
Post.where("id > ?", id).order(id: :asc).limit(1).first
end
def prev
Post.where("id < ?", id).order(id: :desc).limit(1).first
end
posts_controller.rb
def show
@post = Post.friendly.find(params[:id])
# this is used in the show.html.erb view for posts
@randomize_posts = [
@post.answer_choice,
@post.answer_choice_2,
@post.answer_choice_3,
@post.answer_choice_4,
@post.answer_choice_5
].shuffle
end
文章/ show.html.erb
<%= link_to "← Previous Question", @post.prev, :class => 'button previous-question' %>
<%= link_to "Next Question →", @post.next, :class => 'button next-question' %>
答案 0 :(得分:2)
有几种方法可以做到这一点。我建议采用确定性方法,让不同的用户得到不同的结果,但同一个用户总是会得到相同的结果。这允许您具有随机性并进行前进/后退导航而无需存储额外数据。
要以确定的方式随机化,您可以对帖子的ID和当前用户ID应用md5
方法:
posts = Post.order("md5('#{current_user.id}' || posts.id::text)")
现在找到下一个和前一个的最简单方法是查看哪一个在当前之前和之后。你通过计算它的md5
哈希知道当前的位置,所以你只需要找到它之前或之前的那个:
Post
.where("md5('?' || '?') > md5('?' || posts.id::text)", current_user.id, id, current_user.id)
.order("md5('#{current_user.id}' || posts.id::text)")
.limit(1)
应用于您的模型,它看起来像:
def next(user)
ordered_posts(user)
.where("md5('?' || '?') > md5('?' || posts.id::text)", user.id, id, user.id)
end
def prev(user)
ordered_posts(user)
.where("md5('?' || '?') < md5('?' || posts.id::text)", user.id, id, user.id)
end
private
def ordered_posts(user)
Post.order("md5('#{current_user.id}' || posts.id::text)")
end
视图看起来像:
<%= link_to "← Previous Question", @post.prev(current_user), :class => 'button previous-question' %>
<%= link_to "Next Question →", @post.next(current_user), :class => 'button next-question' %>