mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-05-19 06:15:44 -04:00
Pulling plantings from elastic search too
This commit is contained in:
@@ -19,10 +19,11 @@ module CropSearch
|
|||||||
# boost the crops that are planted the most
|
# boost the crops that are planted the most
|
||||||
plantings_count: plantings_count,
|
plantings_count: plantings_count,
|
||||||
harvests_count: harvests_count,
|
harvests_count: harvests_count,
|
||||||
|
photos_count: photo_associations_count,
|
||||||
# boost this crop for these members
|
# boost this crop for these members
|
||||||
planters_ids: plantings.pluck(:owner_id),
|
planters_ids: plantings.pluck(:owner_id),
|
||||||
has_photos: photos.size.positive?,
|
has_photos: photo_associations_count.positive?,
|
||||||
photo: default_photo&.thumbnail_url,
|
thumbnail_url: default_photo&.thumbnail_url,
|
||||||
scientific_name: default_scientific_name&.name,
|
scientific_name: default_scientific_name&.name,
|
||||||
description: description,
|
description: description,
|
||||||
created_at: created_at.to_i
|
created_at: created_at.to_i
|
||||||
|
|||||||
@@ -12,11 +12,26 @@ module HarvestSearch
|
|||||||
crop_slug: crop.slug,
|
crop_slug: crop.slug,
|
||||||
crop_name: crop.name,
|
crop_name: crop.name,
|
||||||
crop_id: crop_id,
|
crop_id: crop_id,
|
||||||
|
plant_part: plant_part&.name,
|
||||||
owner_id: owner_id,
|
owner_id: owner_id,
|
||||||
|
owner_name: owner.login_name,
|
||||||
planting_id: planting_id,
|
planting_id: planting_id,
|
||||||
|
photos_count: photos.size,
|
||||||
|
has_photos: photos.size.positive?,
|
||||||
thumbnail_url: default_photo&.thumbnail_url,
|
thumbnail_url: default_photo&.thumbnail_url,
|
||||||
created_at: created_at.to_i
|
created_at: created_at.to_i
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.homepage_records(limit)
|
||||||
|
self.search('*',
|
||||||
|
limit: limit,
|
||||||
|
where: {
|
||||||
|
photos_count: {gt: 0},
|
||||||
|
},
|
||||||
|
boost_by: [:created_at],
|
||||||
|
load: false
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
37
app/models/concerns/planting_search.rb
Normal file
37
app/models/concerns/planting_search.rb
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
module PlantingSearch
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
searchkick
|
||||||
|
|
||||||
|
scope :search_import, -> { includes(:owner, :crop) }
|
||||||
|
|
||||||
|
def search_data
|
||||||
|
{
|
||||||
|
slug: slug,
|
||||||
|
crop_slug: crop.slug,
|
||||||
|
crop_name: crop.name,
|
||||||
|
crop_id: crop_id,
|
||||||
|
owner_id: owner_id,
|
||||||
|
owner_name: owner.login_name,
|
||||||
|
planted_from: planted_from,
|
||||||
|
photos_count: photos.size,
|
||||||
|
harvests_count: photos.size,
|
||||||
|
has_photos: photos.size.positive?,
|
||||||
|
thumbnail_url: default_photo&.thumbnail_url,
|
||||||
|
created_at: created_at.to_i
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.homepage_records(limit)
|
||||||
|
self.search('*',
|
||||||
|
limit: limit,
|
||||||
|
where: {
|
||||||
|
photos_count: {gt: 0},
|
||||||
|
},
|
||||||
|
boost_by: [:created_at],
|
||||||
|
load: false
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -5,7 +5,7 @@ class Photo < ApplicationRecord
|
|||||||
PHOTO_CAPABLE = %w(Garden Planting Harvest Seed Post Crop).freeze
|
PHOTO_CAPABLE = %w(Garden Planting Harvest Seed Post Crop).freeze
|
||||||
|
|
||||||
has_many :photo_associations, foreign_key: :photo_id, dependent: :delete_all, inverse_of: :photo
|
has_many :photo_associations, foreign_key: :photo_id, dependent: :delete_all, inverse_of: :photo
|
||||||
has_many :crops, through: :photo_associations
|
has_many :crops, through: :photo_associations, counter_cache: true
|
||||||
|
|
||||||
validates :fullsize_url, url: true
|
validates :fullsize_url, url: true
|
||||||
validates :thumbnail_url, url: true
|
validates :thumbnail_url, url: true
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
class PhotoAssociation < ApplicationRecord
|
class PhotoAssociation < ApplicationRecord
|
||||||
belongs_to :photo, inverse_of: :photo_associations
|
belongs_to :photo, inverse_of: :photo_associations
|
||||||
belongs_to :photographable, polymorphic: true
|
belongs_to :photographable, polymorphic: true
|
||||||
belongs_to :crop, optional: true
|
belongs_to :crop, optional: true, counter_cache: true
|
||||||
|
|
||||||
validate :photo_and_item_have_same_owner
|
validate :photo_and_item_have_same_owner
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ class Planting < ApplicationRecord
|
|||||||
include Ownable
|
include Ownable
|
||||||
include PredictPlanting
|
include PredictPlanting
|
||||||
include PredictHarvest
|
include PredictHarvest
|
||||||
|
include PlantingSearch
|
||||||
|
|
||||||
friendly_id :planting_slug, use: %i(slugged finders)
|
friendly_id :planting_slug, use: %i(slugged finders)
|
||||||
|
|
||||||
# Constants
|
# Constants
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class CropSearchService
|
|||||||
limit: limit,
|
limit: limit,
|
||||||
load: false,
|
load: false,
|
||||||
body: body
|
body: body
|
||||||
).response['hits']['hits'].map { |c| c['_source'] }
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.recent(limit)
|
def self.recent(limit)
|
||||||
@@ -37,6 +37,6 @@ class CropSearchService
|
|||||||
limit: limit,
|
limit: limit,
|
||||||
load: false,
|
load: false,
|
||||||
boost_by: { created_at: { factor: 100 } } # default factor is 1
|
boost_by: { created_at: { factor: 100 } } # default factor is 1
|
||||||
).response['hits']['hits'].map { |c| c['_source'] }
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
.card.crop-thumbnail
|
.card.crop-thumbnail
|
||||||
= link_to crop_path(slug: crop['slug']) do
|
= link_to crop_path(slug: crop['slug']) do
|
||||||
|
|
||||||
= image_tag(crop['photo'] ? crop['photo'] : placeholder_image,
|
= image_tag(crop['thumbnail_url'] ? crop['thumbnail_url'] : placeholder_image,
|
||||||
alt: crop['name'],
|
alt: crop['name'],
|
||||||
class: 'img img-card')
|
class: 'img img-card')
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
%h2= t('.recently_harvested')
|
%h2= t('.recently_harvested')
|
||||||
- Harvest.has_photos.recent.includes(:crop, :owner, :photos, :plant_part).limit(6).each do |harvest|
|
- Harvest.homepage_records(6).each do |harvest|
|
||||||
- cache harvest do
|
- cache harvest do
|
||||||
= link_to harvest, class: 'list-group-item list-group-item-action flex-column align-items-start' do
|
= link_to harvest, class: 'list-group-item list-group-item-action flex-column align-items-start' do
|
||||||
.d-flex.w-100.justify-content-between.homepage--list-item
|
.d-flex.w-100.justify-content-between.homepage--list-item
|
||||||
%div
|
%div
|
||||||
%h5= harvest.crop.name
|
%h5= harvest['crop_name']
|
||||||
%span.badge.badge-success=harvest.plant_part
|
%span.badge.badge-success=harvest['plant_part']
|
||||||
%small.text-muted
|
%small.text-muted
|
||||||
harvested by #{harvest.owner}
|
harvested by #{harvest['owner_name']}
|
||||||
%p.mb-2= image_tag harvest_image_path(harvest), width: 75, class: 'rounded shadow'
|
%p.mb-2
|
||||||
|
= image_tag harvest['thumbnail_url'], width: 75, class: 'rounded shadow'
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
%h2= t('.recently_planted')
|
%h2= t('.recently_planted')
|
||||||
- Planting.has_photos.recent.includes(:owner, :crop).limit(6).each do |planting|
|
- Planting.homepage_records(6).each do |planting|
|
||||||
- cache planting do
|
= link_to planting, class: 'list-group-item list-group-item-action flex-column align-items-start' do
|
||||||
= link_to planting, class: 'list-group-item list-group-item-action flex-column align-items-start' do
|
.d-flex.w-100.justify-content-between.homepage--list-item
|
||||||
.d-flex.w-100.justify-content-between.homepage--list-item
|
%p.mb-2
|
||||||
%p.mb-2
|
= image_tag planting['thumbnail_url'], width: 75, class: 'rounded shadow'
|
||||||
= image_tag planting_image_path(planting), width: 75, class: 'rounded shadow'
|
.text-right
|
||||||
.text-right
|
%h5= planting['crop_name']
|
||||||
%h5= planting.crop.name
|
- if planting['planted_from'].present?
|
||||||
- if planting.planted_from.present?
|
%span.badge.badge-success= planting['planted_from'].pluralize
|
||||||
%span.badge.badge-success= planting.planted_from.pluralize
|
%small.text-muted planted by #{planting['owner_name']}
|
||||||
%small.text-muted planted by #{planting.owner}
|
|
||||||
|
|||||||
@@ -1,6 +1,17 @@
|
|||||||
class AddHarvestCountToCrop < ActiveRecord::Migration[5.2]
|
class AddHarvestCountToCrop < ActiveRecord::Migration[5.2]
|
||||||
def change
|
def change
|
||||||
add_column :crops, :harvests_count, :integer
|
add_column :crops, :harvests_count, :integer
|
||||||
|
add_column :crops, :photo_associations_count, :integer
|
||||||
add_column :plant_parts, :harvests_count, :integer
|
add_column :plant_parts, :harvests_count, :integer
|
||||||
|
|
||||||
|
Crop.all.each do |crop|
|
||||||
|
Crop.reset_counters(crop.id, :harvests)
|
||||||
|
Crop.reset_counters(crop.id, :photos)
|
||||||
|
say "Crop #{crop.name} counter caches updated"
|
||||||
|
end
|
||||||
|
PlantPart.all.each do |pp|
|
||||||
|
PlantPart.reset_counters(pp.id, :harvests)
|
||||||
|
say "PlantPart #{pp.name} counter caches updated"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -197,6 +197,7 @@ ActiveRecord::Schema.define(version: 2019_12_09_202348) do
|
|||||||
t.integer "median_days_to_last_harvest"
|
t.integer "median_days_to_last_harvest"
|
||||||
t.jsonb "openfarm_data"
|
t.jsonb "openfarm_data"
|
||||||
t.integer "harvests_count"
|
t.integer "harvests_count"
|
||||||
|
t.integer "photo_associations_count"
|
||||||
t.index ["name"], name: "index_crops_on_name"
|
t.index ["name"], name: "index_crops_on_name"
|
||||||
t.index ["requester_id"], name: "index_crops_on_requester_id"
|
t.index ["requester_id"], name: "index_crops_on_requester_id"
|
||||||
t.index ["slug"], name: "index_crops_on_slug", unique: true
|
t.index ["slug"], name: "index_crops_on_slug", unique: true
|
||||||
|
|||||||
Reference in New Issue
Block a user