Ruby on rails 如何在查询中添加uniq
看来我有这个Ruby on rails 如何在查询中添加uniq,ruby-on-rails,postgresql,ruby-on-rails-5,Ruby On Rails,Postgresql,Ruby On Rails 5,看来我有这个 <div> <% @readers.each do |reader| %> <% user_profile_url = user_url(reader.user.username) %> <div> <%= link_to user_profile_url do %> <%= reader.user.usernam
<div>
<% @readers.each do |reader| %>
<% user_profile_url = user_url(reader.user.username) %>
<div>
<%= link_to user_profile_url do %>
<%= reader.user.username %>
<% end %>
<span>[<%= reader.created_at.to_date %>]</span>
</div>
<% end %>
</div>
def readers_list
@book = Book.find(params[:id])
@readers = @book.downloads.order(created_at: :desc)
end
我有一个问题:如果用户下载twince一本书,在这个列表中我会看到用户名twince。
所以,我知道,我必须加上uniq
我试图在@readers的末尾添加它,但没有成功如何(以及在哪里)添加它强>
我还试着让这个@readers=@book.downloads.where(user_id:params[:user_id]).order(创建于::desc),但它不起作用。使用
DISTINCT
代替uniq
。由于您将获得所有信息,然后执行uniq
,这通常被认为是低效的:
book
.downloads
.select('distinct on (downloads.user_id) downloads.*')
.order('downloads.user_id, downloads.created_at DESC')
downloads
的作用域是JOIN子句,因此两个表中都有created_at列,因此select和order中都有显式引用。另一种选择是使用“Group By”,在rails中可以这样做
@book.downloads.order(created_at: :desc).group(:user_id)
如果您想检查什么更快,“DISTINCT”或“GROUP BY”则是一个很好的起点。您尝试过这个吗<代码>@book.downloads.order(创建于::desc)。独特的@demir是。我尝试了@book.downloads.order(创建于::desc).distinct和@book.downloads.order(创建于::desc.uniq),但没有成功。我想因为我要寻找的“uniq值”是关于用户的,所以下载
book\u id
必须在downloads Schema Information
中。不是最新的?我们没有理由在这里调用命令中使用SQL。我会选择.order(:user\u id,created\u at::desc)
来获得相同的结果。您没有读过吗?下载的范围是一个JOIN子句,因此created\u at列出现在两个表@3limin4t0r?中,如果不添加表名,您将出现歧义错误。如何使用中的命令(:user\u id,created\u at::desc)
指定表名。下载上下文Rails知道如何使用下载表.order(:user\u id,created\u at::desc)
将通过“downloads”“user\u id”“downloads”“在“desc
创建”转换为order。我不确定这种结合在哪里起作用。由于book.downloads
生成选择“downloads”。*从“downloads”的“downloads”中选择“downloads”。“book\u id”=«book id»
。我知道你的意思@3limin4t0r。在这个解决方案的末尾有一条横线添加了一条消息,解释了为什么我要让OP引用两个表,而不是仅仅使用您建议的解决方案@3limin4t0r;)这是一个MySQL基准测试。OP正在使用PostgreSQL(我们在尝试不同的解决方案时遇到了不同的错误)。除非您启用了仅\u FULL\u group\u BY
,否则在没有id
的情况下分组将引发错误。