加強 Active Record 的關連性

很多時候我們會使用 Active Record裡面的條件式關連性,但是有時候會覺得使用的關連性似乎有點太多了、太繁雜了。

像是這樣,有兩個 User 有很多 Email ,但是我們想用 Email 的 status cloumn 來判斷是已讀還是未讀。


   
class User < ActiveRecord ::Base
has_many :emails , :dependent => :delete_all
has_many :read_emails , :class_name => "emails" ,:conditions => "status = 'read'"
has_many :unread_emails , :class_name => "emails" , :conditions => "status = 'unread'"
end
這樣的作法可以達成下面的效果
    
a = User.find ( 1 )
a.read_emails
a.unread_emails
雖然方便,但是也意味著光是一個 Email 我們就建立了三個以上的 relationship,並且假設 table 裡面真的有一個叫做 read_emails 的 table ,那不就衝突了嗎?有沒有其他的方式呢?

當然有,這裡有一篇文章講到一些 Active Record relationship Tips ,我最喜歡他的第二個 tips。

class User < ActiveRecord::Base
has_many :emails, :dependent => :delete_all do
def read(reload=false)
@read = nil if reload
@read ||= find(:all, :conditions => "status = 'read'")
end

def unread(reload=false)
@unread = nil if reload
@unread ||= find(:all, :conditions => "status = 'unread'")
end
end
end
在 relationship 後面,加入這樣的方式,可以做到
a = User.find(1)
a.emails.read
a.emails.unread
如此只需要一個 relationship 就可以做倒類似的事情。

你可能感兴趣的:(ActiveRecord)