Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在查询中添加uniq_Ruby On Rails_Postgresql_Ruby On Rails 5 - Fatal编程技术网

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
的情况下分组将引发错误。