2013-08-06 56 views
2

也許有人有一個想法,我可以如何解決以下問題:活動記錄所有查詢從實例

我有一個模型,並希望查詢它。

def MyModel < ActiveRecord::Base 

    # instance method 
    def all 
    my_models = MyModel.all 
    my_models.?? # order my_models ActiveRecord::Relation, that the instance which calls the .all instance method is at first position, and the rest is sorted somehow,..whatever. 
    end 

end 

我怎麼能解決這個問題?

編輯:

實施例: 爲MyModel都有一個名稱。 我的爲MyModel

MyModel.all => #<ActiveRecord::Relation [#<MyModel id: 1, name: "name1">, #<MyModel id: 2, name: "name2">, #<MyModel id: 3, name: "name3">, #<MyModel id: 4, name: "name4">]> 

四個實例,現在我想:

MyModel.find(1).all => #<ActiveRecord::Relation [#<MyModel id: 1, name: "name1">, #<MyModel id: 2, name: "name2">, #<MyModel id: 3, name: "name3">, #<MyModel id: 4, name: "name4">]> 

MyModel.find(2).all => #<ActiveRecord::Relation [#<MyModel id: 2, name: "name2">, #<MyModel id: 1, name: "name1">, #<MyModel id: 3, name: "name3">, #<MyModel id: 4, name: "name4">]> 

MyModel.find(3).all => #<ActiveRecord::Relation [#<MyModel id: 3, name: "name3">, #<MyModel id: 1, name: "name1">, #<MyModel id: 2, name: "name2">, #<MyModel id: 4, name: "name4">]> 
+0

我不確定你想用my_model來完成什麼。 –

+0

我加了一個例子:)。 – Mattherick

回答

2

我相信這完成你的要求。

def all 
    self.class.order("case when id = #{id} then 0 else id end") 
end 
+0

幾乎是的,但有一點錯誤.. MyModel.find(2).all.map(&:id)=> [2,3,4]。 1缺失。 MyModel.find(1).all.map(&:id)=> [1],2,3和4丟失.. – Mattherick

+0

我不能在本地重新創建。如預期的那樣,無論傳遞給'.find'的id如何,我都會得到相同的結果集。你使用的是什麼RDBMS? – deefour

+0

我正在使用sqlite3。其他的事實:鐵軌4.0.0,紅寶石2.0.0-p195 – Mattherick

1

一個可能的解決方案將採取的事實,即一個ActiveRecord ::關係實例響應許多Array實例方法:

def all 
    ary = self.class.order(:id) 
    ary = ary.unshift(self) 
    ary.uniq 
end 

但是這將返回數組的一個實例,這樣你就可以不會繼續追加其他範圍。由你決定在你的情況下是否可以接受。

+0

謝謝!也適用,但我認爲@Deefour的答案更方便。不過謝謝。 – Mattherick

+1

這也不會返回一個ActiveRecord :: Relation實例。 – deefour

+0

是的,這是真的。 – Mattherick