I have two models:
class Venue < ActiveRecord::Base
has_many :loyalty_cards
end
class LoyaltyCard < ActiveRecord::Base
belongs_to :venue
searchkick word_start: [:venue_name, :venue_name_from_relation]
def search_data
attributes.merge(
venue_name_from_relation: self.venue(&:name)
)
end
end
LoyaltyCard has two fields:
venue_id: int #used for relation with venue if such venue exists
venue_name: string #or you can add venue name manually when creating loyalty card
I want to search both fields and tried the following tweak as suggested at Searchkick isses at GitHub (i.e. https://github.com/ankane/searchkick/issues/112): searchkick word_start: [:venue_name, :venue_name_from_relation]
def search_data
attributes.merge(
venue_name_from_relation: self.venue(&:name)
)
end
It searches venue_name successfully, however does not in associated venue.
I also tried doing the following (and few other variations):
def search_data
{
venue_name_from_relation: venue.map(&:name)
}
end
however it fails reindexing with nil class error.
Any ideas?
thanks, Roman
To get the venue name correctly since it is a belongs_to
association not a has_many
def search_data
attributes.merge(
venue_name_from_relation: self.venue_name_from_relation
)
end
def venue_name_from_relation
self.venue.name
end
Then use this to search
fields = ["venue_name", "venue_name_from_relation"]
LoyaltyCard.search(query, fields: fields, load: false)
or boost one field over another using (boost venue_name
over venue_name_from_relation
)
fields = ["venue_name^2", "venue_name_from_relation"]
LoyaltyCard.search(query, fields: fields, load: false)
Do not to forget to reindex
before searching. LoyaltyCard.reindex