很多時候我們會使用 Active Record裡面的條件式關連性,但是有時候會覺得使用的關連性似乎有點太多了、太繁雜了。
像是這樣,有兩個 User 有很多 Email ,但是我們想用 Email 的 status cloumn 來判斷是已讀還是未讀。
當然有,這裡有一篇文章講到一些 Active Record relationship Tips ,我最喜歡他的第二個 tips。
像是這樣,有兩個 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)雖然方便,但是也意味著光是一個 Email 我們就建立了三個以上的 relationship,並且假設 table 裡面真的有一個叫做 read_emails 的 table ,那不就衝突了嗎?有沒有其他的方式呢?
a.read_emails
a.unread_emails
當然有,這裡有一篇文章講到一些 Active Record relationship Tips ,我最喜歡他的第二個 tips。
在 relationship 後面,加入這樣的方式,可以做到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