2011-02-25 168 views
3

我有一個叫note的模型。我目前得到的筆記是這樣的:如何在Ruby on Rails中獲取記錄'某個記錄'?

current_user.notes.order('date DESC, created_at DESC').limit(10).reverse! 

我現在需要做到以下幾點: 乘坐note_id參數,並返回10個注意事項:一,從參數和9名其他的「繞」第一。

理想情況下,根據上面第一行的順序,其他9個音符將在主音符之前分配爲5個,之後爲4個(或之前4個)。

例子:

note note note note primary_note note note note note note 

有時,這將是不可能的。例如,如果primary_note是用戶第二個音符,它應該返回此:

note primary_note note note note note note note note note 

或者,如果它是最新的筆記,用戶只有3注總,它應該返回:

note note primary_note 

我怎樣才能做到這一點?我使用Ruby 1.9.2 &的Rails 3.0.1

回答

4

我不認爲有獲得與單個查詢這些音符的方式 - 你至少需要兩個。從SQL,你所要做的,只有這樣,我的(一定限制)的理解是:

  • 獲取4注意到,「之前」 primary_note
  • 獲取4個筆記「之後」 primary_note
  • 來加入兩套一起類似這樣

東西(警告:未經測試的代碼)

class Note < ActiveRecord::Base 
    # on rails 3 I prefer class methods to named scopes. 
    # they are equally "chainable" and have simpler syntax 
    def self.notes_before(date, limit=4) 
    self.where(['date >= ?', date]).order("date DESC, created_at DESC").limit(limit) 
    end 

    def self.notes_after(date, limit=4) 
    self.where(['date <= ?', date]).order("created_at ASC, date ASC").limit(limit) 
    end 

    # Instance method 
    def notes_around(limit=4) 
    (Note.notes_before(self.date, limit) << self) + Note.notes_after(self.date, limit) 
    end 
end 

用法:

n = Note.new(:date => Date.yesterday) 
n.notes_around # returns the 9 notes around n, plus n 
n.notes_around(40) # returns 81 notes 

# in addition: 
Note.notes_before(Date.today, 40) # last 40 notes 
Note.notes_after(Date.today, 10).where(:color => 'blue') # chainable 

但我想不出一個「可鏈接的類方法」的。也許我不知道足夠的SQL。

理想的是,9的其它註釋將被 , 基於上面

在第一 線順序(& 5之前或之後4)分配爲5主音符 和4後前

我不明白你如何確定你需要「4」或「5」在這種情況下。所以我假設你知道這一點。

+1

你可以在一個使用UNION的SQL查詢中完成它,但是你必須繞過一些ActiveRecord細節。 – 2011-02-25 18:11:05

2

您可以在查詢中使用range condition

class Note 
    scope :around_note_id, lambda { |id| where(:id => range_for_search(id) } 

    def self.range_for_search(id) 
    # your logic here, i.e. 
    # (id-1)..(id+1) 
    end 
end 

> Note.around_note_id(3) 
+0

#edit。應該是'自我'。range_for_search' – monocle 2011-02-25 15:57:48

+0

我認爲這將是罰款,如果查詢是由id命令,但它看起來OP要按日期排序'date DESC,created_at DESC' - 我認爲這使得問題難以解決 – DanSingerman 2011-02-25 16:54:14

+0

你是還假設id是連續的(或者更具體地說,它們從未被刪除)。 – 2011-02-25 18:09:04