Skip to content

Instantly share code, notes, and snippets.

@faucct
Last active August 29, 2015 14:07
Show Gist options
  • Save faucct/b8a23fc346a3379e0064 to your computer and use it in GitHub Desktop.
Save faucct/b8a23fc346a3379e0064 to your computer and use it in GitHub Desktop.
class Fragrance < ActiveRecord::Base
belongs_to :brand
validates_presence_of :brand, :name
validates_uniqueness_of :name, scope: :brand
has_many :pictures, -> { order(:order) }, class_name: 'FragrancePicture', dependent: :destroy
accepts_nested_attributes_for :pictures, allow_destroy: true
has_many :inventory_items, dependent: :destroy
has_many :opinions, class_name: 'FragranceOpinion', dependent: :destroy
has_many :reviews, class_name: 'FragranceReview', dependent: :destroy
has_many :notes, class_name: 'FragranceNote', dependent: :destroy
accepts_nested_attributes_for :notes, allow_destroy: true
has_many :note_votes, class_name: 'FragranceNoteVote', dependent: :destroy
has_many :note_suggestions, class_name: 'FragranceNoteSuggestion'
has_many :views, class_name: 'FragranceView', dependent: :destroy
has_many :offers, dependent: :destroy
has_many :votes, class_name: 'FragranceVote', dependent: :destroy
has_many :reminds, class_name: 'FragranceRemind', dependent: :destroy, foreign_key: :fragrance1_id
translates :description
active_admin_translates :description
def to_param
name
end
def first_picture_url(style)
if pictures.any?
pictures.first.file.url(style)
else
''
end
end
def opinions_hash
FragranceOpinion.fragrance(id).as_hash
end
def inventory_items_hash
InventoryItem.fragrance(id).as_hash
end
def offers_hash
Offer.fragrance(id).as_hash
end
def also_viewed
Fragrance.joins(views: { user: :fragrance_views }).where(fragrance_views_users: { fragrance_id: id } ).where.not(id: id)
end
end
class FragrancesController < ApplicationController
before_action :set_breadcrumbs
before_action :set_fragrance, except: [:search, :create]
before_action :authenticate_user!, only: [:add_note, :create]
autocomplete :fragrance, :name
def show
@fragrance.views.where(user: current_user).first_or_create.increment(:count).save if user_signed_in?
end
def search
if params[:brand_name].present?
brand = Brand.find_by_name!(params[:brand_name])
fragrances = brand.fragrances
else
fragrances = Fragrance.all
end
@fragrances = fragrances.where("lower(name) like ?", "%#{params[:name].downcase}%").order(:name)
render json: @fragrances.collect { |fragrance| fragrance.name }
end
def add_note
note = Note.find_by_name(params[:fragrance_note_suggestion][:name])
if note
fragrance_note = note.fragrance_note_votes.new
else
fragrance_note = FragranceNoteSuggestion.new(params.require(:fragrance_note_suggestion)
.permit(:name, :description))
end
fragrance_note.fragrance_id = @fragrance.id
fragrance_note.user_id = current_user.id
fragrance_note.save
respond_to do |format|
format.html { redirect_to [brand, fragrance] }
format.js do
@fragrance = fragrance_note.fragrance
render 'fragrances/add_note', layout: false
end
end
end
def create
brand = Brand.find_by_name(params[:brand_name])
fragrance_suggestion = FragranceSuggestion.new(params.require(:fragrance_suggestion).permit(:name, :description))
fragrance_suggestion.user_id = current_user.id
fragrance_suggestion.brand_id = brand.id
if fragrance_suggestion.save
render layout: false
else
render js: '', layout: false
end
end
def reminds
@fragrance.reminds.create(params.require(:fragrance_remind).permit(:fragrance_name))
redirect_to [@fragrance.brand, @fragrance]
end
private
def set_breadcrumbs
@breadcrumbs = []
end
def set_fragrance
brand = Brand.find_by_name!(params[:brand_name])
@fragrance = brand.fragrances.find_by_name(params[:name] || params[:fragrance_name])
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment