2009-10-11 48 views
0

我有以下的情況只有一條記錄真實的,所有其他錯誤,在軌

class RecordA 
    has_many :recordbs 
end 

class RecordB 
    belongs_to :recorda 
end 

RecordA有很多recordbs,但其中只有一個可以是一個積極的recordb。我需要像myRecordA.active_recordb

如果我添加一個新的列如is_active RecordB,那麼我有可能同時設置兩個記錄到is_active = true的潛在問題。

我可以使用哪種設計模式?

謝謝!

+1

最好使用REAL模型名稱而不是「RecordA」和「RecordB」,這有助於人們思考你的想法, – 2009-10-11 20:58:47

回答

1

您可以定義RecordB一類方法是:

class RecordB < ActiveRecord::Base 
    def self.active 
    first(:conditions => { :active => true } 
    end 
end 
5

讓我們改變你的榜樣。有一個講座室,有很多人,只有一個人可以成爲老師。

只需在LectureRoom中有一個屬性來指示哪個人是教師就容易得多。這樣您就不需要更換多個人員記錄以便交換教師。您只需更新LectureRoom記錄。

+0

完全同意。 – Peter 2009-10-11 22:46:21

1

我會使用命名範圍來查找活躍的講師。

class Person 
    named_scope :currently_speaking, :conditions => {:active => true} 
end 

然後我會說這就是在課堂上講師:

class ClassRoom 
    def lecturer 
    people.currently_speaking.first 
    end 
end 

真正的問題是確保當你激活了別人,他們成爲唯一活躍的人。我可能是這樣做的:

class Person 
    belongs_to :class_room 

    before_save :ensure_one_lecturer 

    def activate! 
    self.active = true 
    save 
    end 

    def ensure_one_lecturer 
    if self.active && changed.has_key?(:active) 
     class_room.lecturer.update_attribute(:active, false) 
    end 
    end 

end 

這樣,一切都在一個事務中完成的,如果你已經改變了活動狀態的時候纔會這麼做,而且應該很容易地測試(我沒有測試過這一點)。

+0

另外,我還要補充一點,當你這樣做時,你可能需要在人員表上使用鎖定,否則在激活人員時可能會看到競爭狀態。 – 2009-10-12 03:15:57

相關問題