2015-10-15 90 views
0

我想創建一個修改ActiveRecord::Baseselect方法的寶石。舉例來說,當我包括我的寶石和類型:Rails排序寶石

Somemodel.all 

它應該返回由ID下令陣列爲正常,但按降序排列,而不是上升的。我不知道它應該如何看待。我不希望創建這樣的附加方法:

Somemodel.where(name: "John").revert_it 

但簡單地做:

Somemodel.where(name: "John") 

我想知道有關修改ActiveRecord::Base方法,但它沒有任何意義。 IMO最好的方法是在每個ActiveRecord::Base方法完成後進行回調。

+1

我會創造額外的方法中。這會讓你感到困惑,因爲無論誰來到你身後,都無法弄清爲什麼訂單被顛倒過來。 –

+1

可能的重複[默認排序順序爲rails模型嗎?](http://stackoverflow.com/questions/3393687/default-sort-order-for-a-rails-model) –

回答

0

我得到了充分有效的答案:

def self.included(base) 
    base.class_eval do 
    default_scope { order(id: 'desc') } 
    end 
    end 

以上方法應該是一些模塊內,然後模塊包含的一些模型類

+0

雖然我不會鼓勵這個,因爲其他人都提到過的相同原因,請參閱我對@ Drenmi的帖子的評論,以便正確添加ActiveRecord。 – engineersmnky

+0

感謝您的回答。我會考慮它 – mike927

1

不建議修改任何核心方法(除非你有一個非常好的理由),因爲這會在將來造成很多混淆。

即使你正在考慮修改選擇,你必須確保你始終返回ActiveRecord relation,使之能與被鏈接的標準方式,

對於你的榜樣,AR已經有一個方法

User.all.reverse

+1

請用英文標點符號。 – sawa

+0

'User.all.reverse_order'可能會更有效一些(讓DB以相反的順序返回它們,而不是獲取數組並倒轉它) – Doon

+0

@sawa,抱歉..不是英語母語:) – sameera207

2

可以使用ActiveRecord方法default_scope來實現這一目標:

class MyModel < ActiveRecord::Base 

    default_scope { order("id DESC") } 

end 

MyModel.all 
# => SELECT * FROM my_models ORDER BY id DESC 
+0

咋就是理念!但我需要它作爲模塊 – mike927

+0

這就是你的想法!但我需要作爲模塊 - mike927 1小時前 \t \t @ mike927多數民衆贊成你可以使這很容易模塊'ARExtension;擴展ActiveSupport :: Concern; module ClassMethods; default_scope {order(「id DESC」)}; end;結束; ActiveRecord.Base.send(:include,ARExtension)'這會將該默認範圍添加到所有從AR Base繼承的對象,並且不會覆蓋默認範圍。 – engineersmnky