Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获取联接表中的最新条目?_Sql_Ruby On Rails - Fatal编程技术网

Sql 如何获取联接表中的最新条目?

Sql 如何获取联接表中的最新条目?,sql,ruby-on-rails,Sql,Ruby On Rails,我使用的是Rails 3.1、MySQL和3个类:Computer、LifecycleStatus和LifecycleEntry 我希望跟踪计算机生命周期状态随时间的历史记录,以便生命周期尝试中的列为:Computer\u id:integer、lifecycle\u status\u id:integer和changed\u at:datetime。计算机在LifecycleStatus中可以有多个条目 我成立了以下协会: Computer has_many :lifecycle_entr

我使用的是Rails 3.1、MySQL和3个类:Computer、LifecycleStatus和LifecycleEntry

我希望跟踪计算机生命周期状态随时间的历史记录,以便生命周期尝试中的列为:Computer\u id:integer、lifecycle\u status\u id:integer和changed\u 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_条目记录)被分配到该状态

我已成功创建了正确的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

如果您将“活动”状态反规范化到LifecycleEntry本身,并在每次创建新条目时对其进行更新,这似乎会更简单。这将在每次读取时为您保存一个GROUP BY/MAX查询

如果您有status列,它将像LifecycleEntry.active.where(:lifecycle\u status\u id=>6)一样简单。计算机,其中active是LifecycleEntry上的作用域

以下各点也是如此:

  • 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可能在当前活动的LifecycleEntry之前,因此只有在更改的位置在之后时,才必须将新的LifecycleEntry设置为active。另外,对于创建的第一个LifecycleEntry,始终设置为active。

如果您将“active”状态反规范化到LifecycleEntry本身,并在每次创建新条目时更新它,这似乎会更简单。这将在每次读取时为您保存一个GROUP BY/MAX查询

如果您有status列,它将像LifecycleEntry.active.where(:lifecycle\u status\u id=>6)一样简单。计算机,其中active是LifecycleEntry上的作用域

以下各点也是如此:

  • 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可能在当前活动的LifecycleEntry之前,因此只有在更改的位置在之后时,才必须将新的LifecycleEntry设置为active。此外,对于创建的第一个LifecycleEntry,始终设置为active。

我想我也可以在计算机模型中设置一个lifecycle\u status\u id列,并在LifecycleEntry上设置一个after\u create/update回调来更新计算机中的列?因此,您建议在LifecycleEntry中添加一个active:boolean列,在创建新条目时,我将其设置为true,并以某种方式伪造所有其他项该计算机的条目?您只需在一个条目上伪造“活动”状态,当您的更新操作开始时,您就可以对其进行处理,例如lifecycle\u entry.Computer.active\u entry我根据您的建议,用我最终得到的解决方案更新了您的答案。请注意,关于当前条目的部分不一定是最新的。我将其更改为更高效。我想我还可以在计算机模型中有一个lifecycle\u status\u id列,并在LifecycleEntry上有一个更新计算机中的列的after\u create/update回调?因此,您建议在lifecycle尝试创建一个新条目时,我将其设置为true,并以某种方式伪造该计算机的所有其他条目?您只需要在一个条目上伪造“活动”状态,当更新操作开始时,您就可以处理它,例如lifecycle\u entry.Computer.active\u entry我用我最终得到的解决方案更新了您的答案,根据你的建议。请注意,关于当前条目的部分不一定是最新的。我将其更改为更有效一点。