This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ObserverSearchData | |
attr_reader :id, :search_data | |
def initialize(id, search_data) | |
@id = id | |
@search_data = search_data | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
... | |
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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?) |