Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.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/0/assembly/5.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
Ruby on rails 如何为所有类编写方法_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何为所有类编写方法

Ruby 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 编写外

我正在尝试编写一种方法,该方法将直接应用于几个具有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。