- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要能够使用 ActiveRelation 将任意数量的子选择与 UNION
链接起来。
我对 ARel 的实现有点困惑,因为它似乎假设 UNION
是一个二进制运算。
但是:
( select_statement_a ) UNION ( select_statement_b ) UNION ( select_statement_c )
是有效的 SQL。这是否可以在不进行令人讨厌的字符串替换的情况下实现?
最佳答案
尽管亚当·拉塞克(Adam Lassek)走在正确的 rails 上,但你可以做得比他提出的更好一点。我刚刚解决了一个类似的问题,试图从社交网络模型中获取 friend 列表。可以通过各种方式自动获取好友,但我希望有一个 ActiveRelation 友好的查询方法来处理进一步的链接。所以我有
class User
has_many :events_as_owner, :class_name => "Event", :inverse_of => :owner, :foreign_key => :owner_id, :dependent => :destroy
has_many :events_as_guest, :through => :invitations, :source => :event
def friends
friends_as_guests = User.joins{events_as_guest}.where{events_as_guest.owner_id==my{id}}
friends_as_hosts = User.joins{events_as_owner}.joins{invitations}.where{invitations.user_id==my{id}}
User.where do
(id.in friends_as_guests.select{id}
) |
(id.in friends_as_hosts.select{id}
)
end
end
end
它利用了 Squeels 子查询支持。生成的SQL是
SELECT "users".*
FROM "users"
WHERE (( "users"."id" IN (SELECT "users"."id"
FROM "users"
INNER JOIN "invitations"
ON "invitations"."user_id" = "users"."id"
INNER JOIN "events"
ON "events"."id" = "invitations"."event_id"
WHERE "events"."owner_id" = 87)
OR "users"."id" IN (SELECT "users"."id"
FROM "users"
INNER JOIN "events"
ON "events"."owner_id" = "users"."id"
INNER JOIN "invitations"
ON "invitations"."user_id" =
"users"."id"
WHERE "invitations"."user_id" = 87) ))
通过对上述代码稍加修改来演示需要可变数量组件的替代模式
def friends
friends_as_guests = User.joins{events_as_guest}.where{events_as_guest.owner_id==my{id}}
friends_as_hosts = User.joins{events_as_owner}.joins{invitations}.where{invitations.user_id==my{id}}
components = [friends_as_guests, friends_as_hosts]
User.where do
components = components.map { |c| id.in c.select{id} }
components.inject do |s, i|
s | i
end
end
end
这是对OP确切问题的解决方案的粗略猜测
class Shift < ActiveRecord::Base
def self.limit_per_day(options = {})
options[:start] ||= Date.today
options[:stop] ||= Date.today.next_month
options[:per_day] ||= 5
queries = (options[:start]..options[:stop]).map do |day|
where{|s| s.scheduled_start >= day}.
where{|s| s.scheduled_start < day.tomorrow}.
limit(options[:per_day])
end
where do
queries.map { |c| id.in c.select{id} }.inject do |s, i|
s | i
end
end
end
end
关于ruby-on-rails - 如何使用 ActiveRelation 编写 UNION 链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8045823/
我刚学rails。我非常喜欢 Rails。在几乎所有情况下,它都完全破坏了 Java 和相关的生产力解决方案——我对 Java 有十多年的经验,真的非常快……这说明了一些问题!如果 Rails 无法做
我是新来的 rails 。玩得很开心。查询API虽然给了我 一些麻烦。我一直在快速缩放并做很多事情, 但这是我第一次花费数小时试图弄清楚。 它不像我以前用过的任何东西——普通的 SQL 或 Hiber
假设我们在 Controller 的某处有 @posts = Post.published.per(10).page(params[:page])。稍后我们需要更新所有已发布的帖子 (Post.pub
我需要哈希化 ActiveRelation!例如我有这样的AR arel = MyClass.page(options[:page]).per(options[:per]) 这里有一种简单的方法可以用
我有名为 User、Activity 和 Task 的模型,我可以执行以下操作 > puts Activity.joins(:task).to_sql SELECT "activities".* FR
我正在尝试获取可能仅与特定用户相关的特定关键字并返回关系。 Keyword.where(text: ['key1', 'key2']) .tagged_users(:u, :rel) .whe
我的应用程序中有许多多行 ActiveRelation 查询方法,我不确定编写这些方法的最惯用方式。看看这个例子: def postal_code_ids_within(miles) nearby
我需要能够使用 ActiveRelation 将任意数量的子选择与 UNION 链接起来。 我对 ARel 的实现有点困惑,因为它似乎假设 UNION 是一个二进制运算。 但是: ( select_s
当我向 will_paginate 传递一个 ActiveRelation 时,它总是调用它的 #count 方法并访问数据库以找出项目的总数。但是这个操作需要时间,而且我已经缓存并准备好了总数。我可
我查看了 Arel 源代码和一些 Rails 3.0 的 activerecord 源代码,但关于 Arel 是否会改变我们使用 includes() 的能力,我似乎无法为自己收集到一个好的答案,
我有一个模型: class Event has_many :participations has_many :participants, :through => :participat
我的评分系统很简单,用户喜欢或不喜欢这篇文章。 基本上,我有这样的东西,而且效果很好: class Article has_many :ratings def self.by_ratings
我是一名优秀的程序员,十分优秀!