我正在使用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'}
?
答案 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中从未发生过这种情况。