Skip to content

Instantly share code, notes, and snippets.

@bplexico
bplexico / gist:5745064
Created June 9, 2013 20:22
moved HtmlScrubber
#change inside Post
def scrubbed_html
HtmlScrubber.scrub(cooked)
end
#updated SearchObserver#after_save method
def after_save(obj)
if obj.class == Post && obj.cooked_changed?
search_data = obj.scrubbed_html << " " << obj.topic.title
search_data << " " << obj.topic.category.name if obj.topic.category
@bplexico
bplexico / gist:5745080
Created June 9, 2013 20:28
create ObserverSearchData
class ObserverSearchData
attr_reader :id, :search_data
def initialize(id, search_data)
@id = id
@search_data = search_data
end
end
@bplexico
bplexico / gist:5745086
Created June 9, 2013 20:30
SearchObserver after creating ObserverSearchData
class SearchObserver < ActiveRecord::Observer
observe :topic, :post, :user, :category
def self.update_index(table, id, search_data)
table_name = "#{table}_search_data"
foreign_key = "#{table}_id"
# Would be nice to use AR here but not sure how to execut Postgres functions
# when inserting data like this.
rows = Post.exec_sql_row_count("UPDATE #{table_name} SET search_data = TO_TSVECTOR('english', ?) WHERE #{foreign_key} = ?", search_data, id)
@bplexico
bplexico / gist:5745108
Created June 9, 2013 20:36
pass in object itself
class ObserverSearchData
attr_reader :search_data
def initialize(obj, search_data)
@obj = obj
@search_data = search_data
end
def object_name
@obj.class.name.downcase
...
def self.update_posts_index(observer_search_data)
update_index(observer_search_data.object_name, observer_search_data.id, observer_search_data.search_data)
end
def self.update_users_index(observer_search_data)
update_index(observer_search_data.object_name, observer_search_data.id, observer_search_data.search_data)
end
@bplexico
bplexico / gist:5745132
Created June 9, 2013 20:43
remove individual update methods
#remove these methods from SearchObserver
def self.update_posts_index(observer_search_data)
update_index(observer_search_data.object_name, observer_search_data.id, observer_search_data.search_data)
end
def self.update_users_index(observer_search_data)
update_index(observer_search_data.object_name, observer_search_data.id, observer_search_data.search_data)
end
def self.update_categories_index(observer_search_data)
#removed from update_index
table_name = "#{observer_search_data.object_name}_search_data"
foreign_key = "#{observer_search_data.object_name}_id"
#new ObserverSearchData class
class ObserverSearchData
attr_reader :search_data
def initialize(obj, search_data)
@obj = obj
@bplexico
bplexico / gist:5745152
Created June 9, 2013 20:49
latest update_index method
def self.update_index(observer_search_data)
# Would be nice to use AR here but not sure how to execut Postgres functions
# when inserting data like this.
rows = Post.exec_sql_row_count("UPDATE #{observer_search_data.table_name} SET search_data = TO_TSVECTOR('english', ?) WHERE #{observer_search_data.foreign_key} = ?", observer_search_data.search_data, observer_search_data.id)
if rows == 0
Post.exec_sql("INSERT INTO #{observer_search_data.table_name} (#{observer_search_data.foreign_key}, search_data) VALUES (?, TO_TSVECTOR('english', ?))", observer_search_data.id, observer_search_data.search_data)
end
rescue
# don't allow concurrency to mess up saving a post
end
@bplexico
bplexico / gist:5745167
Created June 9, 2013 20:54
OSD with update_index
class ObserverSearchData
attr_reader :search_data
def initialize(obj, search_data)
@obj = obj
@search_data = search_data
end
def update_index
# Would be nice to use AR here but not sure how to execut Postgres functions
@bplexico
bplexico / gist:5745171
Created June 9, 2013 20:55
SearchObserver with no update_index
class SearchObserver < ActiveRecord::Observer
observe :topic, :post, :user, :category
def after_save(obj)
if obj.class == Post && obj.cooked_changed?
search_data = obj.scrubbed_html << " " << obj.topic.title
search_data << " " << obj.topic.category.name if obj.topic.category
ObserverSearchData.new(obj, search_data).update_index
end
if obj.class == User && (obj.username_changed? || obj.name_changed?)