如何有效地检查活动记录对象是否具有关联?

时间:2013-01-27 15:03:47

标签: ruby-on-rails rails-activerecord

我有一个拥有成千上万条快照记录的应用程序。这些“快照”中的极少数(例如1000个中的1个)将通过:has_many关联具有一个或多个“位置”。

如何有效地发现快照是否有位置而不为每个快照触发活动记录查询?我目前的解决方案是为快照添加一个布尔字段 - 如果快照有一个位置,'has_position'设置为true。这似乎有点混乱,因为这意味着每次创建一个位置时我都必须修改相关的快照。是否有更简洁的方法来处理这种情况?

create_table "snapshots", :force => true do |t|
  t.datetime "created_at",                       
  t.datetime "updated_at",    
  t.boolean  "has_position",   
end

create_table "positions", :force => true do |t|
  t.integer  "snapshot_id"
  t.datetime "created_at",  
  t.datetime "updated_at",  
end

1 个答案:

答案 0 :(得分:0)

如果您使用positions的引用生成snapshots的迁移,将使用

生成迁移文件
add_index :positions, :snapshot_id

附加到它的末尾。

如果snapshot_id上的索引,数据库将采用log(n)查询来确定某个职位是否至少有一个关联记录。不如使用布尔值的常量时间,但只有成千上万的记录,它不应该明显更长(除非你非常频繁地这样做)。

此外,简单的has_position布尔值可能比您想要在没有索引的情况下维护更难。您可以在创建关联位置时将其设置为true,但在删除时无法将其设置为false,因为可能存在另一个,并且您必须执行表扫描试。

如果由于某些原因使用索引是不合需要的(或者您确实需要不断的时间查找),那么我建议使用:counter_cache列。