【问题标题】:Rails uniq Public ActivityRails uniq 公共活动
【发布时间】:2015-05-23 11:00:57
【问题描述】:
t = PublicActivity::Activity.arel_table

@activities = PublicActivity::Activity.where(
    (t[:trackable_type].eq("Lesson").and(t[:trackable_id].in(@my_lessons_ids)))
    .or(t[:trackable_type].eq("Post").and(t[:trackable_id].in(@my_posts_ids)))
    .or(t[:trackable_type].eq("WallPost").and(t[:trackable_id].in(@my_wallposts_ids)))
    .or(t[:trackable_type].eq("Comment").and(t[:trackable_id].in(@my_comments_ids)))
    .or(t[:trackable_type].eq("Course").and(t[:trackable_id].in(@my_courses_ids)))
    .or(t[:trackable_type].eq("Group").and(t[:trackable_id].in(@my_groups_ids)))
).order("id DESC").uniq{|a| "#{a.trackable_type}-#{a.trackable_id}"}

在我的数据库中,我有“Trackable_type”+“trackable_id”的重复条目,因为如果用户多次单击“更新”,我会得到很多条目。 所以,我只想得到其中之一。 我试过了 .uniq{|a| "#{a.trackable_type}-#{a.trackable_id}"}

但什么也没发生。

返回的 SQL 查询:

"SELECT DISTINCT \"activities\".* FROM \"activities\" WHERE (((((\"activities\".\"trackable_type\" = 'Lesson' AND \"activities\".\"trackable_id\" IN (11, 39, 40, 16, 5, 3, 12, 9, 13, 19, 18, 37, 15, 23, 24, 29, 20, 10, 25, 26, 27, 17, 28, 22, 21, 30, 33, 35, 34, 36, 32, 31) 或 \"activities\".\"trackable_type\" = '发布' AND \"activities\".\"trackable_id\" IN (50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 14, 13, 12, 10, 5)) 或 \"activities\".\"trackable_type\" = 'WallPost' AND \"activities\".\"trackable_id\" IN (158, 157, 155, 154, 153, 152, 151, 132、131、130、129、128、127、126、125、124、119、118、117、116、115、 114、113、111、110、109、108、107、106、105、104、103、102、101、100、 99, 98, 93, 92, 91, 90, 87, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58、57、56、55、54、53、52、51、50、49、48、47、46、45、44、43、42、 41, 39, 38, 37, 36, 35, 34, 33, 31, 30, 29, 28, 27, 26, 25, 24, 22, 20, 19, 17, 16, 15, 14, 13, 10, 7, 6, 5, 4)) 或 \"activities\".\"trackable_type\" = '评论' AND \"activities\".\"trackable_id\" IN (100, 99, 98, 95, 83, 82, 81, 79, 78、71、70、69、68、67、65、63、62、61、60、59、58、57、56、55、52、 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14)) 或 \"activities\".\"trackable_type\" = 'Course' AND \"activities\".\"trackable_id\" IN (8, 1, 5, 7)) 或 \"activities\".\"trackable_type\" = '组' AND \"activities\".\"trackable_id\" IN (14, 11, 4, 5, 6, 3, 2, 1)) 订单 按 id DESC"

更新:

如果我尝试:

@activities = PublicActivity::Activity.select("distinct trackable_type, trackable_id").where(
        (t[:trackable_type].eq("Lesson").and(t[:trackable_id].in(@my_lessons_ids)))
        .or(t[:trackable_type].eq("Post").and(t[:trackable_id].in(@my_posts_ids)))
        .or(t[:trackable_type].eq("WallPost").and(t[:trackable_id].in(@my_wallposts_ids)))
        .or(t[:trackable_type].eq("Comment").and(t[:trackable_id].in(@my_comments_ids)))
        .or(t[:trackable_type].eq("Course").and(t[:trackable_id].in(@my_courses_ids)))
        .or(t[:trackable_type].eq("Group").and(t[:trackable_id].in(@my_groups_ids)))
    ).order("id DESC")

我明白了:

更新 2

如果我尝试

@activities = PublicActivity::Activity.select("DISTINCT ON(trackable_type, trackable_id) *")

我明白了

PG::SyntaxError: ERROR: syntax error at or near "ON" LINE 1: SELECT COUNT(DISTINCT ON(trackable_type, trackable_id) *) FR... ^ : SELECT COUNT(DISTINCT ON(trackable_type, trackable_id) *) FROM "activities"

【问题讨论】:

  • 试试这个.uniq{|a| a.trackable_type && a.trackable_id }
  • 您使用什么数据库客户端? MySql, Postgresql.. ?
  • @sparkle 这样做PublicActivity.select("distinct trackable_type, trackable_id")...

标签: ruby-on-rails postgresql activerecord rails-activerecord public-activity


【解决方案1】:

没有arel 的查询将是:

PublicActivity::Activity.select("DISTINCT ON(trackable_type, trackable_id) *")
              .where("(trackable_type = ? and trackable_id IN (?))
                      or (trackable_type = ? and trackable_id IN (?))",
                      "Lesson", @my_lessons_ids,
                      "Post", @my_post_ids)

【讨论】:

  • PG::SyntaxError: 错误:在“ON”或附近出现语法错误 LINE 1: SELECT COUNT(DISTINCT ON(trackable_type, trackable_id) *) FR... ^ : SELECT COUNT(DISTINCT ON( trackable_type, trackable_id) *) FROM "activities" WHERE ((trackable_type = 'Lesson' and trackable_id IN (11,39,40,16,5,3,12,9,13,19,18,37,15,23, 24,29,20,10,25,26,27,17,28,22,21,30,33,35,34,36,32,31)) 或 (trackable_type = 'Post' and trackable_id IN (NULL) ))
  • 我这样做:PublicActivity::Activity.select("DISTINCT ON(trackable_type, trackable_id) *") 可能是带有 "PublicActivity::Activity" 的东西?
  • 好的,问题出在“kaminari”上。你有办法按 id DESC 订购吗?
  • PG::InvalidColumnReference: 错误: SELECT DISTINCT ON 表达式必须匹配初始 ORDER BY 表达式
  • @sparkle 好吧.. 似乎您的应用程序的一些默认范围被插入了。阅读this。是的.. DISTINCT ON 表达式必须匹配最左边的 ORDER BY 表达式。 ORDER BY 子句通常包含其他表达式,这些表达式确定每个 DISTINCT ON 组中所需的行优先级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
相关资源
最近更新 更多