gpt4 book ai didi

ruby-on-rails-3 - 为什么在 Rails 3.1 上不再使用带有作用域的合并方法?

转载 作者:行者123 更新时间:2023-12-04 01:52:32 25 4
gpt4 key购买 nike

我偶然发现了一篇关于 Rails 3+ 范围的精彩文章:http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html

您可以在那里阅读(在“疯狂小镇”部分),可以像这样合并来自不同模型的范围:

class User < ActiveRecord::Base

scope :published, lambda {
joins(:posts).group("users.id") & Post.published
}
end

它按预期工作,并允许您执行以下操作:

User.published.to_sql
#=> SELECT users.* FROM "users"
# INNER JOIN "posts" ON "posts"."author_id" = "users"."id"
# WHERE (posts.published_at IS NOT NULL AND posts.published_at <= '2010-02-27 02:55:45.063181')
# GROUP BY users.id

我在我的 Rails 3.1 项目中尝试了这种方法,显然它不再起作用了。

所以我克隆了这篇文章的 Rails 3.0.0-beta1 项目,通过我的眼睛看到这些人没有说谎,事情正在按照他们所说的方式进行。

然后我 3.1'ed 它,现在我得到:

ruby-1.9.2-p290 :003 > User.published.to_sql
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."author_id" = "users"."id" GROUP BY users.id
Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE (posts.published_at IS NOT NULL AND posts.published_at <= '2011-10-05 11:45:00.512231')
User Load (0.1ms) SELECT "users".* FROM "users"
NoMethodError: undefined method `to_sql' for []:Array
from (irb):3
from /home/jerefrer/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.0/lib/rails/commands/console.rb:45:in `start'
from /home/jerefrer/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.0/lib/rails/commands/console.rb:8:in `start'
from /home/jerefrer/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.0/lib/rails/commands.rb:40:in `<top (required)>'
from script/rails:9:in `require'
from script/rails:9:in `<main>'

==> 不再工作了。

这让我很伤心,因为范围合并很棒,现在我不能像我想要的那样 DRY。

你知道吗 :
  • 两个版本之间发生了什么?
  • 还有其他方法可以做同样的事情吗?
  • 最佳答案

    &方法看起来不再有效(太糟糕了,我发现语法很简洁)。您可以将其替换为 ActiveRecord::Relation#merge :

    class User < ActiveRecord::Base

    scope :published, lambda {
    joins(:posts).group("users.id").merge(Post.published)
    }
    end

    编辑

    看起来它不会回来了,在 rails 3.0.10 中尝试它会给出弃用警告:
    DEPRECATION WARNING: Using & to merge relations has been deprecated and will be removed in Rails 3.1. Please use the relation's merge method, instead.

    这是弃用它的提交,以防有人感兴趣: https://github.com/rails/rails/commit/66003f596452aba927312c4218dfc8d408166d54

    关于ruby-on-rails-3 - 为什么在 Rails 3.1 上不再使用带有作用域的合并方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7660867/

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