Как сказал Тадман в комментариях к вопросу, мне пришлось изобрести собственное решение, так как Rails технически не допускает теги в том смысле, в котором они мне нужны.Вот обобщенное решение для тех, кто заинтересован в том, чтобы сделать нечто подобное:
Я создал новую таблицу с именем SimilarPages
:
create_table :similar_pages, {:id => false} do |t|
t.integer :page_id, :similar_page_id
# you could also do `t.string :tag_name` or similar
end
add_index :similar_pages, :page_id
add_index :similar_pages, :similar_page_id
Технически, я мог бы сделать самореферентные отношения has_many
на Pages
, но я решил не делать этого, поскольку мне никогда не нужно ссылаться на него таким образом.Я только что создал простую SimilarPage
модель:
class SimilarPage < ActiveRecord::Base
belongs_to :page
belongs_to :similar_page, :class_name => 'Page'
end
Затем, используя ar-extensions
(потому что я ленивый, а также потому, что я хотел сделать это в одном операторе INSERT), я делаю это вблок кеша:
SimilarPage.delete_all("page_id = '#{@page_id}'")
SimilarPage.import [:page_id, :similar_page_id], @similar_pages.collect {|s| SimilarPage.new(:page_id=>@page_id,:similar_page_id=>s.id)}
В моем expire_cache_for
методе моего Обозревателя я делаю это:
SimilarPage.where(:similar_page_id => expiring_page.id).all.each do |s|
ActionController::Base.new.expire_fragment(/page_show__#{s.page_id}__.*/)
# the regexp is for different currencies being cached ^
Rails.cache.delete("page_show_#{s.page_id}")
end