2010-06-05 28 views
0
  • 我有一個通知表,其中包含不同事件的不同類型的通知。
  • 表格中有一個notifications_type:string列,其中包含通知類型,即「foo」或「bar」或「oof」
  • 我希望用戶能夠選擇他們想要顯示的通知,所以在那裏是在用戶模型中對應於prefs_display_foo:boolean, prefs_display_bar:boolean的結果下面的複選框。
  • 什麼是一個優雅的方式,我可以在查找中設置:conditions以正確顯示排序結果?另外,目前我有它作爲用戶模型的方法,但我會怎麼做它作爲一個has_many :notifications, :conditions => .....

回答

1

你可以試試這個

離開的has_many不附加任何條件,然後創建一個named_scope處理偏好,此代碼未經測試

class User 
    has_many :notifications 

    def notification_preferences 
     list = [] 
     list << 'Foo' if prefs_display_foo 
     list << 'Bar' if prefs_display_bar  
     # etc... 
     return list 
    end 
end 

class Notification 
    belongs_to :user 

    named_scope :preferred, 
     lambda { |preferences| { 
      :conditions => ["notifications_type IN (?)", preferences] 
      } 
     } 
end 

# ... 
user = User.find(1) 
notifications = user.notifications.preferred(user.notification_preferences) 
+0

太棒了。我對命名示波器有點新,但我可以將它們合併嗎?這意味着,我還有一個prefs_display_results:整數他們想要多少結果,所以如果我添加另一個範圍稱爲「限制」,我可以使用類似notifications = user.notifications.preferred(user.notification_preferences).limit(user.prefs_display_results) Kevin 2010-06-06 23:56:38

+0

是的,你可以鏈named_scopes(限制可能是保留字,不知道) – house9 2010-06-06 23:59:38

+0

沒關係...看着它我只是擴大lambda查詢和數組 – Kevin 2010-06-07 00:00:04