allow add_index, inherit: true
add_replica already supports inherit: true do. It would be nice if add_index also supported it.
How it would work
algoliasearch if: :published do
attribute :title, :description
attribute :starts_at do
starts_at.to_i
end
searchableAttributes %w[title unordered(description)]
attributesToSnippet %w[description]
attributesForFaceting %w[filterOnly(starts_at)]
add_replica STARTS_AT_ASC_INDEX, inherit: true do
customRanking ['asc(starts_at)']
end
add_index ADMIN_INDEX_NAME, inherit: true do
attributesForFaceting %w[state]
end
end
The idea is that ADMIN_INDEX_NAME would not require repeated definition of:
attribute :title, :description
attribute :starts_at do
starts_at.to_i
end
searchableAttributes %w[title unordered(description)]
attributesToSnippet %w[description]
and it would not get the STARTS_AT_ASC_INDEX replica.
I tried to replicate this behavior with:
add_index ADMIN_INDEX_NAME, inherit: true, primary_settings: self
similarly to how add_replica works under the hood but there were certain problems with this approach. Namely starts_at was not using the Proc with to_i conversion.
Also there is an API documentation of Ruby client https://www.algolia.com/doc/api-client/ruby/getting-started/ and there is tutorial for Rails https://www.algolia.com/doc/api-client/rails/indices/#target-multiple-indices but I could not find a full API documentation for algoliasearch-rails to know which exact options are supported on which methods.
Or maybe you can recommend other ways to handle this scenario? Defining a method on the model and using it as attribute name, maybe?
According to the documentation, this should work but unfortunately, it doesn't. I added inherit: true but it doesn't use the attributes I defined before.
In addition I get the error NoMethodError: undefined method 'to_settings' for nil:NilClass which happens here https://github.com/algolia/algoliasearch-rails/blob/master/lib/algoliasearch-rails.rb#L755
Ok, adding :primary_settings => self to the options removed the error but when reading the code I realized that it really only inherits OPTIONS but not attributes.
+1 for this - did anyone find an alternate solution to avoid repetition?
It would be very useful, and would help refactor this https://github.com/algolia/algoliasearch-rails/issues/307#issuecomment-463529441
I'm working on it 👍 see PR #335
I think #335 is getting close. I introduce 2 new options: inherit_settings: true and inherit_attributes: true. Both need inherit: true to work.
I know it's a lot of option but it's the best way I found to keep backward compatibility.
I'm currently writing tests but if anyone can try this PR this will be very useful 🙏 Everything I tested by hand worked as expected but I could have forgotten something.
Original example
With this PR, the original snippet would be
algoliasearch if: :published do
attribute :title, :description
attribute :starts_at do
starts_at.to_i
end
searchableAttributes %w[title unordered(description)]
attributesToSnippet %w[description]
attributesForFaceting %w[filterOnly(starts_at)]
add_replica STARTS_AT_ASC_INDEX, inherit: true, inherit_settings: true, inherit_attributes: true do
customRanking ['asc(starts_at)']
end
add_index ADMIN_INDEX_NAME, inherit: true, inherit_settings: true, inherit_attributes: true do
attributesForFaceting %w[state]
end
end
The PR looks great @julienbourdeau! It's letting me refrain from duplicating thousands of lines of attribution declarations. Thank you!
This should be merged into the gem. I tried to ping a few current Algolia devs on the linked thread. If there's someone else at Algolia who would be better to ping, I'd be grateful if you could say the word...