2011-02-25 175 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