加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails-3 – 范围使用除了不工作的Rails

发布时间:2020-12-17 02:32:15 所属栏目:百科 来源:网络整理
导读:我写嗨,但是不会让它,所以我写更长的句子:)嗨顺便说一下. 看起来我的范围不起作用. 我写了那个范围: 范围:有序,– (字段,顺序){except(:order).order(“#{field}#{order}”)} 但在检查SQL时它返回以下内容: irb p.levels.ordered("name","ASC").to_sql=
我写嗨,但是不会让它,所以我写更长的句子:)嗨顺便说一下.

看起来我的范围不起作用.

我写了那个范围:

范围:有序,– >(字段,顺序){except(:order).order(“#{field}#{order}”)}

但在检查SQL时它返回以下内容:

irb >p.levels.ordered("name","ASC").to_sql
=> "SELECT "levels".* FROM "levels" WHERE ("levels".pie_id = 6 AND ("levels"."parent_id" = 0)) ORDER BY position ASC,name ASC"

注意:位置ASC不应该在那里

但是在我的范围之前添加时它会起作用…

irb > p.levels.except(:order).ordered("name","ASC").to_sql
 => "SELECT "levels".* FROM "levels" WHERE ("levels".pie_id = 6 AND ("levels"."parent_id" = 0)) ORDER BY name ASC" `

是否在范围内可用?或者你看到任何可以帮助我的东西吗?

Ruby 1.9.2p290

Rails 3.0.14

谢谢

解决方法

您可能已经认为可以通过重新排序来实现目标.所以这里是我的理论,为什么重新排序工作,除非没有.

重要的是,方法如order,where,除了由ActiveRecord :: Relation的实例处理,而范围,例如从您的示例中排序,由ActiveRecord :: Relation的实例委托给您的模型类.

some_relation.order(:x)方法只返回some_relation的新副本,其中:x添加到order_values列表中.同样,some_relation.except(:order)将返回some_relation的副本,其中包含空order_values.只要调用链包含这样的关系方法,除了我们期望的工作.

当作为lambda返回关系实现作用域时,对作用域方法的调用最终会与作用于lambda返回的关系返回的模型关系合并:

scopes[name] = lambda do |*args|
  options = scope_options.is_a?(Proc) ? scope_options.call(*args) : scope_options

  relation = if options.is_a?(Hash)
    scoped.apply_finder_options(options)
  elsif options
    scoped.merge(options) # <- here options is what returned by your :ordered lambda
  else
    scoped
  end

  extension ? relation.extending(extension) : relation
end

并且这种合并不会保留效果,除非它只对被合并的关系之一进行.如果我们合并a和b,并且b没有订单设置,但是a确实如此,结果仍然会有订单.现在重新排序使用一个技巧:它在关系上设置特殊标志reorder_flag,控制合并如何携带order_values.

这是我的测试样本.我正在使用default_scope将订单注入Product#scoped.在您的示例中,订单可能通过Pie中的关联注入Level#作用域,其类似于has_many:levels,:order => ‘位置’.

class Product < ActiveRecord::Base
  default_scope order('id DESC')
  scope :random_order,lambda {
    r = order('random()')
    puts "from lambda: " + r.order_values.inspect
    r
  }
end

# in console:

>> Product.scoped.order_values
=> ["id DESC"]

>> Product.random_order.order_values
from lambda: ["id DESC","random()"]
=> ["id DESC","id DESC","random()"]

# now if I change the first line of lambda to
# r = except(:order).order('random()')

>> Product.random_order.order_values
from lambda: ["random()"]
=> ["id DESC","random()"]

正如您所看到的,由于Product.scoped具有id DESC顺序,因此尽管它已从范围返回的关系中清除,但它仍显示在结果中.

以下是相关来源的链接列表:

> relation’s order and reorder methods
> relation’s except method
> relation’s merge method,注意第29行周围如何使用reorder_flag
> scope method

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读