2010-05-29 44 views
15

我想写一个named scope从它的id中获得记录。如何让Rails中的named_scope返回一个值而不是数组?

例如,我有一个名为Event的模型,我想使用named_scope来模拟Event.find(id)以获得未来的灵活性。

我在我的模型中使用此代码:

named_scope :from_id, lambda { |id| {:conditions => ['id= ?', id] } } 

,我把它从我的控制器像Event.from_id(id)。但我的问题是,它返回一个Event对象而不是一个对象的数组。

因此,如果我想获得的事件名称,我必须写

event = Event.from_id(id) 
event[0].name 

,而我要的是

event = Event.from_id(id) 
event.name 

难道我做错了什么吗?

回答

10

正如达米恩提到的,仅使用自定义范围来查找ID是不可取的。但要回答你的问题:

查找记录named_scope将始终返回一个ActiveRecord::NamedScope::Scope对象,其行为与数组类似。如果只是你的查询返回一个记录,您可以使用first的方法直接获得ActiveRecord的对象,像这样:

event = Event.from_id(id).first 
event.name # will work as you expect 
+0

嗨吉米 感谢您的快速回答。为什么我想要一个命名范围是(如我在Damien的评论中提到的) 因为以后我可能只想获取活动事件所以我只能更改命名范围而不打破现有代码(如只添加活动= 1)请让我知道你的意见干杯,sameera – sameera207 2010-05-29 07:48:01

5

这里没有必要使用范围。你可以做Event.find_by_id id
findfind_by_id之间的区别在于,如果记录不存在,则第一个将产生ActiveRecordNotFoundException。第二个将返回零。

编写一个作用域以通过它的id获取记录是一个非常糟糕的id,因为它是由rails本身提供的。

+0

嗨达米恩, 感谢您的快速回复。为什么我想把它作为命名范围是因为后来我可能只想获取活动事件 那么我就可以只更改已命名的范围而不打破现有的代码(例如只添加active = 1) 请让我知道你的意见 欢呼声, sameera – sameera207 2010-05-29 07:46:00

+1

@sameera你可以添加一个通用的方法('def ... end');它不一定是一个命名的范围。 – 2010-05-29 08:16:21

10

在这种情况下,我想创建一个类的方法

def self.from_id(id) 
    self.find(id).first 
end 

又如:

class Invoice 
    def self.number 
    self.find(:first, 
     :select => "max(number) As last, max(number)+1 As next", 
     :conditions => "type = 'SalesOrder'") 
    end 
end 

方法是这样的好,然后named_scope。您可以拨打Invoice.number.next,好于named_scope返回Invoice.number[0].next

相关问题