如何只获得一对相同的db记录?

时间:2016-01-29 07:11:18

标签: ruby-on-rails ruby

我在db表中有记录,只能通过id和创建/更新时间来区分。我怎样才能获得唯一的记录? 我试过这种方式,但它没有工作:

msg_to_user = user.messages.new_messages.uniq

我会解释。用户可以手动关注帖子,但用户也可以自动跟踪相同的帖子。所以如果帖子被某人评论过,我只想发一条消息。

1747    test message    TamadaTours 12  new 2016-01-29 06:14:04.736869  2016-01-29 06:48:55.948529  32964382
1748    test message    TamadaTours 12  new 2016-01-29 06:14:04.741184  2016-01-29 06:48:55.951371  32964382

4 个答案:

答案 0 :(得分:1)

数据库中的所有记录都是uniq(至少因为ID列,默认情况下具有uniq约束)。

您可能希望使用DISTINCT

Model.select('DISTINCT column_name1, column_name2')

答案 1 :(得分:1)

你的问题有缺陷......

在关系数据库中拥有id ...也称为primary_key ...,以便您可以主动识别所需的唯一记录:

  

主键唯一指定表中的元组。为了使属性成为一个好的主键,它不能重复

当你写..."我怎样才能得到唯一的记录" ...答案是根据他们的id仅提取记录。

如果你将问题细化到你真正想要的......

  

如果帖子已被某人评论,我只想发送 一条消息

-

换句话说,您想要提取一组唯一的user_ids(无重复项),您可以向其发送新邮件吗?

为此,您可以使用...

@recipients = Message.select(:user_id).distinct #-> all unique user_ids

如果您正试图拉动"新的"用户的消息,但只显示第一个消息(如果他们相同),您将要使用以下内容:

@msg_to_user = user.messages.new_messages.uniq(:title)

Ref

更好的实施模式是验证新消息的唯一性:

#app/models/message.rb
class Message < ActiveRecord::Base
   validates :user_id, uniqueness: { scope: :message_id } #-> replace message_id with other unique identifier
end

这将确保仅为用户提供一条新消息。

答案 2 :(得分:0)

你也可以在你的查询中使用group by

Model.all.group("column_name")

答案 3 :(得分:0)

提取数据但摆脱ORM上下文的一种方法。

# maps every record to hash, remove the ID entry and then removes duplicates
msg_to_user = user.messages.new_messages.attributes.map { |e| e.except('ID') }.uniq