2012-02-16 55 views
1

我使用Rails 3.1,MySQL和3類工作:計算機,LifecycleStatus & LifecycleEntry如何獲取連接表中的最新條目?

我想跟蹤計算機的LifecycleStatus的歷史隨着時間的推移所以LifecycleEntry的欄目有:COMPUTER_ID:整數,lifecycle_status_id:整數和changed_at:datetime。計算機可以在LifecycleStatus中有多個條目。

我已成立了以下關聯:

Computer 
    has_many :lifecycle_entries, :order => "changed_at DESC" 
    has_many :lifecycle_statuses, :through => :lifecycle_entries 

LifecycleEntry 
    belongs_to :computer 
    belongs_to :lifecycle_status 

LifecycleStatus 
    has_many :lifecycle_entries 

我想看到的,對於特定的LifecycleStatus,哪些計算機當前分配給該狀態(他們最近lifecycle_entries記錄)。

我已經成功地創建正確的SQL來獲取此信息,但我不知道如何將此轉化爲一個Rails的關聯:如果你非規範化

SELECT id, le.computer_id, lifecycle_status_id 
FROM lifecycle_entries AS le 
INNER JOIN (
    SELECT lemax.computer_id, MAX(changed_at) AS latest 
    FROM lifecycle_entries AS lemax 
    GROUP BY lemax.computer_id 
) maxdates 
ON le.changed_at = maxdates.latest 
AND le.computer_id = maxdates.computer_id 
WHERE lifecycle_status_id = 6 

回答

1

看起來這將是簡單的「活動'狀態添加到LifecycleEntry本身,每次創建新條目時更新它。這樣您每次閱讀時都可以爲您節省GROUP BY/MAX查詢。

如果您有狀態列,它將與LifecycleEntry.active.where(:lifecycle_status_id => 6).computers一樣簡單,其中active是LifecycleEntry上的範圍。

所以,做到以下幾點:

  • 一個active布爾字段添加到LifecycleEntry
  • 回調添加到LifecycleEntry模型設置活動入口

這裏是回調:

after_save :set_active 

private 

def set_active 
    last_active_entry = self.computer.active_lifecycle_entry 

    if last_active_entry.nil? 
    update_attributes(:active => true) 
    elsif changed_at > last_active_entry.changed_at 
    last_active_entry.update_attributes(:active => false) 
    update_attributes(:active => true) 
    end 
end 

它'需要注意的是,正在創建的LifecycleEntry可能會先於當前活動的,所以如果changed_at在之後,您只能將新的LifecycleEntry設置爲活動狀態。另外,對於創建的第一個LifecycleEntry,始終設置活動狀態。

+0

我想我也可以在計算機模型中有一個lifecycle_status_id列,並在LifecycleEntry上有一個after_create/update回調函數來更新計算機中的列? – 2012-02-16 22:14:48

+0

所以你建議在LifecycleEntry中添加一個active:boolean列,當創建一個新條目時,我將它設置爲true,並以某種方式僞造該計算機的所有其他條目? – 2012-02-16 22:17:15

+0

您只需要僞造一個條目中的「活動」狀態,當您的更新操作開始時您就可以處理它。 lifecycle_entry.computer.active_entry – bdon 2012-02-16 22:21:38

相關問題