gpt4 book ai didi

ruby-on-rails - Arel 聚合、计数、外部连接?

转载 作者:数据小太阳 更新时间:2023-10-29 08:06:15 25 4
gpt4 key购买 nike

我有一个 Fact 模型,它 has_many :votes。投票还有一个 user_id 字段。我想在 Fact 模型的范围内表达以下内容:给我所有具有 0 票且 user_id 等于 X 的事实。

我对 Arel 不太熟悉,无法理解如何解决这个问题。想法?

最佳答案

这个有效:

class Fact < ActiveRecord::Base
scope :by_user, lambda { |id| joins(:user).where('users.id == ?', id).readonly(false) }
scope :vote_count, lambda { |count| where('? == (select count(fact_id) from votes where votes.fact_id == facts.id)', count)}
end

Fact.by_user(1).vote_count(0)

vote_count 作用域有点像 sqly,但您可以随心所欲地链接这些查找器,您还可以通过以下方式查看底层 sql:

Fact.by_user(1).vote_count(0).to_sql

除了您的评论之外,您可以通过首先声明关系来在纯 Arel 中做同样的事情:

f = Arel::Table.new(:facts)
v = Arel::Table.new(:votes)
u = Arel::Table.new(:users)

然后组合查询并将其呈现为 sql。

sql = f.join(u).on(f[:user_id].eq(1)).where('0 == (select count(fact_id) from votes where votes.fact_id == facts.id)').to_sql

您可以使用运算符对列进行操作: f[:user_id].eq(1)

然后使用它:

Fact.find_by_sql(sql)

我相信您还可以做很多事情来获得更优雅的语法(没有 'where 0 == ...' )。我也很确定 Rails3 范围在幕后使用 Arel - http://m.onkey.org/active-record-query-interface

关于ruby-on-rails - Arel 聚合、计数、外部连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4121487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com