default_scope ActiveRecord 4.1块用于订购

时间:2014-06-11 12:58:10

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我正在使用ActiveRecord 4.1,default_scope上的某些内容发生了变化,我的整个部署因此行而失败:

default_scope order('pos ASC')

到目前为止我已对此进行了评论,但您如何以块形式编写此排序?或者是否有更好的方法在模型中对结果进行排序

该模型如下所示:

class Answer < ActiveRecord::Base
  self.table_name="THE_ANSWERS"
  self.primary_key="id"
  self.sequence_name = :autogenerated
  # -> default_scope order('pos ASC')

  belongs_to :question
end

我假设有人可以写default_scope { where order: 'pos ASC'}

2 个答案:

答案 0 :(得分:1)

您可以像这样使用default_scope

scope :ordered, ->{ order(pos: :asc) }
default_scope { ordered }

或直接:

default_scope { order(pos: :asc) } 

答案 1 :(得分:1)

延长MrYoshiji先生的答案:

您可以将default_scope直接定义为:

default_scope { order(:pos) } 

因为默认排序总是升序

Rails 4.1 default_scope中的更改表明,default_scope将与同一字段中模型中定义的所有其他范围合并。

例如:

如果您的模型中有类似的内容:

class Answer < ActiveRecord::Base
  ##..
  default_scope { where pos: 1 } 
  scope :get_positions, ->(mypos) { where pos: mypos }
end

然后执行以下操作时:

Answer.all
# SELECT "answers".* FROM "answers" WHERE "answers"."pos" = 1

Answer.get_positions(10)
# SELECT "answers".* FROM "answers" WHERE "answers"."pos" = 1 AND "answers"."pos" = 10

注意 default_scope合并到get_positions范围的查询中,因为它们是在相同的字段上(即pos以前版本的Rails中从未发生过这种情况。