Ruby on rails 如何从两个相同的数据库中仅获取一个db记录?
我在db表中有记录,这些记录只能因ID和创建/更新时间而有所不同。我怎样才能得到唯一的记录? 我试过这种方法,但没有成功:Ruby on rails 如何从两个相同的数据库中仅获取一个db记录?,ruby-on-rails,ruby,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
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
数据库中的所有记录都是uniq(至少因为ID列,默认情况下它有uniq约束) 您可能希望使用:
数据库中的所有记录都是uniq(至少因为ID列,默认情况下它有uniq约束) 您可能希望使用:
您也可以像这样在查询中使用GROUPBY
Model.all.group("column_name")
您也可以像这样在查询中使用GROUPBY
Model.all.group("column_name")
一种提取数据的方法,但要摆脱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
一种提取数据的方法,但要摆脱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
你的问题有缺陷 拥有
id
。。。也被称为。。。在关系数据库中,您可以主动识别所需的唯一的记录:
主键唯一地指定表中的元组。为了使属性成为良好的主键,它不能重复
当你写。。。“我怎样才能得到唯一的记录”。。。答案是只根据记录的
id
提取记录
如果你把你的问题细化到你真正想要的
如果帖子被人评论过,我只想发送一条消息
--
换句话说,您希望提取一组唯一的用户ID
(无重复项),以便向其发送新消息
要做到这一点,您可以使用
@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
#app/models/message.rb
类消息用其他唯一标识符替换message_id
结束
这将确保用户只收到一条新消息。您的问题有缺陷 拥有
id
。。。也被称为。。。在关系数据库中,您可以主动识别所需的唯一的记录:
主键唯一地指定表中的元组。为了使属性成为良好的主键,它不能重复
当你写。。。“我怎样才能得到唯一的记录”。。。答案是只根据记录的
id
提取记录
如果你把你的问题细化到你真正想要的
如果帖子被人评论过,我只想发送一条消息
--
换句话说,您希望提取一组唯一的用户ID
(无重复项),以便向其发送新消息
要做到这一点,您可以使用
@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
#app/models/message.rb
类消息用其他唯一标识符替换message_id
结束
这将确保用户只显示一条新消息。由于ID值不同,记录不相等。这是ORM的有效透视图。如果您只需要知道除ID以外的字段,则使用具有DISTINCT的自定义SELECT。由于ID值不同,记录不相等。这是ORM的有效透视图。如果您只需要知道除ID以外的字段,则使用带有DISTINCT的自定义SELECT。使用
.all
是一个非常糟糕的主意。如果您确实只想获得一条记录,则甚至不需要使用DISTINCT/grouping,只需使用.first就可以了。使用.all
是一个非常糟糕的主意。如果你真的只想得到一条记录,你甚至不需要使用distinct/grouping,只需使用.first就可以了。但是如果我想得到记录的所有字段呢?模型。选择('distinct comment\u id,group\u id')
-它只会返回这两个字段,我说得对吗?但我需要这个记录的所有字段。它可以是几个具有相同注释ID和组ID的记录,但我只需要一个!准确地说,所以只需选择所有列(Model.select('DISTINCT comment\u id,group\u id',all\u other\u columns)
),DISTINCT将确保在column@nobilik不可能:)msg\u to\u user=user.messages.new\u messages.select(:所有所需\u非唯一\u字段).distinct
它以这种方式工作,并提供我所需的信息。据我所知,不可能同时选择唯一值和不同的非唯一值。干杯,你的回答对我有帮助!但是如果我想获取记录的所有字段呢?Model.select('DISTINCT comment\u id,group\u id')
-它将只返回这两个字段,对吗?但我需要这个记录的所有字段。它可以是几个具有相同注释ID和组ID的记录,但我只需要一个!准确地说,所以只需选择所有列(Model.select('DISTINCT comment\u id,group\u id',all\u other\u columns)
),DISTINCT将确保在column@nobilik不可能:)msg\u to\u user=user.messages.new\u messages.select(:所有所需\u非唯一\u字段).distinct
它以这种方式工作,并提供我所需的信息。据我所知,不可能同时选择唯一值和不同的非唯一值。干杯,你的回答对我有帮助!此刻,另一个答案为我做了工作。但你的答案是正确的