我在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
答案 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)
更好的实施模式是验证新消息的唯一性:
#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