Ruby on rails 如何为所有类编写方法
我正在尝试编写一种方法,该方法将直接应用于几个具有HABTM关系的模型,以清除任何未使用的关系 def cleanup self.all.each do |f| if f.videos.count == 0 self.destroy(f) end end end 我应该将这个方法保存到哪里?这是这样一个方法的正确语法吗?从理论上讲,它将作为: >>Tag.cleanupRuby on rails 如何为所有类编写方法,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试编写一种方法,该方法将直接应用于几个具有HABTM关系的模型,以清除任何未使用的关系 def cleanup self.all.each do |f| if f.videos.count == 0 self.destroy(f) end end end 我应该将这个方法保存到哪里?这是这样一个方法的正确语法吗?从理论上讲,它将作为: >>Tag.cleanup 编写外
编写外部模块并将其包含在您需要的每个模型中编写外部模块并将其包含在您需要的每个模型中您希望向标记类添加一个类方法,而不是遍历所有需要rails加载每个标记对象然后通过活动录制检查视频的标记对象,使用查询加载所有孤立记录,然后仅销毁这些记录会更快 在Rails 2.x中,您可能会编写这样的代码:这里有标记和视频,而标记和视频是您的连接表
def self.cleanup
find(:all, :conditions => "id NOT IN (select tag_id from tag_videos)").destroy_all
end
在Rails 3中,您可以编写
def self.cleanup
where("id NOT IN (select tag_id from tag_videos)").destroy_all
end
您希望向标记类添加一个类方法,而不是遍历所有需要rails加载每个标记对象然后通过Active Record检查视频的标记对象,使用查询加载所有孤立记录然后仅销毁这些记录会更快 在Rails 2.x中,您可能会编写这样的代码:这里有标记和视频,而标记和视频是您的连接表
def self.cleanup
find(:all, :conditions => "id NOT IN (select tag_id from tag_videos)").destroy_all
end
在Rails 3中,您可以编写
def self.cleanup
where("id NOT IN (select tag_id from tag_videos)").destroy_all
end
可悲的是,人们继续使用has_和_属于许多人,尽管这导致了各种各样的孤儿。A has_many…,:through关系可以标记为:dependent=>:destroy以自动清理未使用的子项。通常,您会有未使用的连接记录,删除它们是令人讨厌的 您可以从SQL的角度来处理这个问题,因为如果不再定义父记录,那么许多记录都是不可访问的。就ActiveRecord而言,它们根本不存在。使用连接模型意味着您可以始终访问这些数据,因为这些数据具有自己的ID has_和_belies_to_许多关系都是基于复合键的,这使得删除它们非常麻烦。通常情况下,您会从id所在的表中删除。。。和并且确信只有目标记录被删除。使用复合键无法执行此操作 您可能会发现这适用于标记到项目关系的示例:
DELETE FROM item_tags, tags, items WHERE item_tags.tag_id=tags.id AND item_tags.item_id=items.id AND tags.id IS NULL AND items.id IS NULL
DELETE语句对于其操作方式可能非常特殊,并且不提供与SELECT语句相同的自由度,SELECT语句的连接可以根据需要定义为left或right、inner或outer
如果在联接表中有一个主ID键,则可以轻松地执行此操作:
DELETE FROM item_tags WHERE id IN (SELECT id FROM item_tags LEFT JOIN tags ON item_tags.tag_id=tags.id LEFT JOIN items ON item_tags.item_id=items.id WHERE tags.id IS NULL AND items.id IS NULL)
事实上,将主键添加到关系表中可能是有利的,即使ActiveRecord忽略它
编辑:
至于你的模块问题,如果你坚持这种方法:
module CleanupMethods
def cleanup
# ...
end
end
class Tag
# Import the module methods as class methods
extend CleanupMethods
end
如果您使用计数器缓存列,您可以更轻松地执行此操作,但您还必须确保计数器缓存是准确的。遗憾的是,人们继续使用has\u和\u-allown\u-to\u-many,尽管这会导致像这样的各种孤儿。A has_many…,:through关系可以标记为:dependent=>:destroy以自动清理未使用的子项。通常,您会有未使用的连接记录,删除它们是令人讨厌的 您可以从SQL的角度来处理这个问题,因为如果不再定义父记录,那么许多记录都是不可访问的。就ActiveRecord而言,它们根本不存在。使用连接模型意味着您可以始终访问这些数据,因为这些数据具有自己的ID has_和_belies_to_许多关系都是基于复合键的,这使得删除它们非常麻烦。通常情况下,您会从id所在的表中删除。。。和并且确信只有目标记录被删除。使用复合键无法执行此操作 您可能会发现这适用于标记到项目关系的示例:
DELETE FROM item_tags, tags, items WHERE item_tags.tag_id=tags.id AND item_tags.item_id=items.id AND tags.id IS NULL AND items.id IS NULL
DELETE语句对于其操作方式可能非常特殊,并且不提供与SELECT语句相同的自由度,SELECT语句的连接可以根据需要定义为left或right、inner或outer
如果在联接表中有一个主ID键,则可以轻松地执行此操作:
DELETE FROM item_tags WHERE id IN (SELECT id FROM item_tags LEFT JOIN tags ON item_tags.tag_id=tags.id LEFT JOIN items ON item_tags.item_id=items.id WHERE tags.id IS NULL AND items.id IS NULL)
事实上,将主键添加到关系表中可能是有利的,即使ActiveRecord忽略它
编辑:
至于你的模块问题,如果你坚持这种方法:
module CleanupMethods
def cleanup
# ...
end
end
class Tag
# Import the module methods as class methods
extend CleanupMethods
end
如果使用计数器缓存列,则可以更轻松地执行此操作,但您还必须确保计数器缓存的准确性。我确实将此作为外部模块编写,然后使用include MyMethod,但它似乎还不想识别它。请尝试使用extend MyModule而不是include MyModule,这会将方法附加到类而不是每个实例。我确实将此作为外部模块编写模块,然后使用include MyMethod,但它似乎还不想识别它。请尝试使用extend MyModule而不是include MyModule,这样可以将方法附加到类而不是eac 例如h。