2010-05-29 49 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

相關問題