remove-acts-as-taggable #38

Merged
bustikiller merged 4 commits from remove-acts-as-taggable into main 2024-08-11 17:23:27 +00:00
7 changed files with 55 additions and 83 deletions
Showing only changes of commit cca869a0c4 - Show all commits

View File

@ -6,14 +6,10 @@ class GuestsController < ApplicationController
# GET /guests or /guests.json # GET /guests or /guests.json
def index def index
@guests = Guest.all @guests = Guest.all
.left_outer_joins(:affinity_groups) .joins(:group)
.order('tags.name' => :asc) .order('groups.name' => :asc)
.includes(:affinity_groups, :unbreakable_bonds)
respond_to do |format| render jsonapi: @guests
format.html
format.json { render jsonapi: @guests }
end
end end
# GET /guests/1 or /guests/1.json # GET /guests/1 or /guests/1.json

View File

@ -1,7 +1,9 @@
class Group < ApplicationRecord class Group < ApplicationRecord
validates :name, uniqueness: true validates :name, uniqueness: true
validates :name, :order, presence: true validates :name, :order, presence: true
has_many :children, class_name: 'Group', foreign_key: 'parent_id' has_many :children, class_name: 'Group', foreign_key: 'parent_id'
belongs_to :parent, class_name: 'Group', optional: true belongs_to :parent, class_name: 'Group', optional: true
has_many :guests
end end

View File

@ -1,6 +1,6 @@
class Guest < ApplicationRecord class Guest < ApplicationRecord
acts_as_taggable_on :affinity_groups, :unbreakable_bonds acts_as_taggable_on :affinity_groups, :unbreakable_bonds
belongs_to :group
def full_name def full_name
"#{first_name} #{last_name}" "#{first_name} #{last_name}"
end end

View File

@ -1,9 +1,13 @@
class SerializableGuest < JSONAPI::Serializable::Resource class SerializableGuest < JSONAPI::Serializable::Resource
type 'guest' type 'guest'
attributes :id, :email attributes :id, :email, :group_id
attribute :name do attribute :name do
"#{@object.first_name} #{@object.last_name}" "#{@object.first_name} #{@object.last_name}"
end end
attribute :group_name do
@object.group.name
end
end end

View File

@ -0,0 +1,5 @@
class AddGroupToGuest < ActiveRecord::Migration[7.1]
def change
add_reference :guests, :group, null: false, foreign_key: true, type: :uuid
end
end

5
db/schema.rb generated
View File

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.1].define(version: 2024_08_11_143801) do ActiveRecord::Schema[7.1].define(version: 2024_08_11_154115) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -44,6 +44,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_08_11_143801) do
t.string "phone" t.string "phone"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.uuid "group_id", null: false
t.index ["group_id"], name: "index_guests_on_group_id"
end end
create_table "seats", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| create_table "seats", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
@ -94,6 +96,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_08_11_143801) do
end end
add_foreign_key "groups", "groups", column: "parent_id" add_foreign_key "groups", "groups", column: "parent_id"
add_foreign_key "guests", "groups"
add_foreign_key "seats", "guests" add_foreign_key "seats", "guests"
add_foreign_key "seats", "tables_arrangements", on_delete: :cascade add_foreign_key "seats", "tables_arrangements", on_delete: :cascade
add_foreign_key "taggings", "tags" add_foreign_key "taggings", "tags"

View File

@ -22,82 +22,44 @@ Expense.create!(name: 'Transportation', amount: 3000, pricing_type: 'fixed')
Expense.create!(name: 'Invitations', amount: 200, pricing_type: 'fixed') Expense.create!(name: 'Invitations', amount: 200, pricing_type: 'fixed')
Expense.create!(name: 'Cake', amount: 500, pricing_type: 'fixed') Expense.create!(name: 'Cake', amount: 500, pricing_type: 'fixed')
Group.create!(name: "Jim's guests", icon: "pi pi-heart").tap do |parent| Group.create!(name: "Jim's guests", icon: 'pi pi-heart').tap do |parent|
parent.children.create!(name: "Jim's family", icon: "pi pi-users").tap do |family| parent.children.create!(name: "Jim's family", icon: 'pi pi-users').tap do |family|
family.children.create!(name: "Jim's close family", icon: "pi pi-home") family.children.create!(name: "Jim's close family", icon: 'pi pi-home')
family.children.create!(name: "Jim's cousins", icon: "pi pi-home") family.children.create!(name: "Jim's cousins", icon: 'pi pi-home')
family.children.create!(name: "Jim's relatives", icon: "pi pi-home") family.children.create!(name: "Jim's relatives", icon: 'pi pi-home')
end end
parent.children.create!(name: "Jim's friends", icon: "pi pi-bullseye") parent.children.create!(name: "Jim's friends", icon: 'pi pi-bullseye')
parent.children.create!(name: "Jim's work", icon: "pi pi-desktop").tap do |work| parent.children.create!(name: "Jim's work", icon: 'pi pi-desktop').tap do |work|
work.children.create!(name: "Jim's besties at work", icon: "pi pi-briefcase") work.children.create!(name: "Jim's besties at work", icon: 'pi pi-briefcase')
end end
end end
Group.create!(name: "Pam's guests", icon: "pi pi-heart-fill").tap do |parent| Group.create!(name: "Pam's guests", icon: 'pi pi-heart-fill').tap do |parent|
parent.children.create!(name: "Pam's family", icon: "pi pi-users").tap do |family| parent.children.create!(name: "Pam's family", icon: 'pi pi-users').tap do |family|
family.children.create!(name: "Pam's close family", icon: "pi pi-home") family.children.create!(name: "Pam's close family", icon: 'pi pi-home')
family.children.create!(name: "Pam's cousins", icon: "pi pi-home") family.children.create!(name: "Pam's cousins", icon: 'pi pi-home')
family.children.create!(name: "Pam's relatives", icon: "pi pi-home") family.children.create!(name: "Pam's relatives", icon: 'pi pi-home')
end end
parent.children.create!(name: "Pam's friends", icon: "pi pi-bullseye") parent.children.create!(name: "Pam's friends", icon: 'pi pi-bullseye')
parent.children.create!(name: "Pam's work", icon: "pi pi-desktop").tap do |work| parent.children.create!(name: "Pam's work", icon: 'pi pi-desktop').tap do |work|
work.children.create!(name: "Pam's besties at work", icon: "pi pi-briefcase") work.children.create!(name: "Pam's besties at work", icon: 'pi pi-briefcase')
end end
end end
Group.create!(name: "Common guests", icon: "pi pi-users").tap do |parent| Group.create!(name: 'Common guests', icon: 'pi pi-users').tap do |parent|
parent.children.create!(name: "College friends", icon: "pi pi-calculator") parent.children.create!(name: 'College friends', icon: 'pi pi-calculator')
parent.children.create!(name: "High school friends", icon: "pi pi-crown") parent.children.create!(name: 'High school friends', icon: 'pi pi-crown')
parent.children.create!(name: "Childhood friends", icon: "pi pi-envelope") parent.children.create!(name: 'Childhood friends', icon: 'pi pi-envelope')
end end
samples = { groups = Group.all
close_family_a: 10,
close_family_b: 10,
cousins_a: 20,
cousins_b: 15,
relatives_a: 15,
relatives_b: 10,
work_a: 10,
work_b: 10,
besties_work_a: 5,
besties_work_b: 5,
college_friends_a: 10,
college_friends_b: 10,
high_school_friends_a: 10,
high_school_friends_b: 10,
childhood_friends_a: 10,
childhood_friends_b: 10,
basket_team_a: 10,
football_team_a: 15,
dance_club: 10
}.each_with_object([]) do |(affinity_group, count), acc|
count.times { acc << affinity_group }
end
NUMBER_OF_GUESTS.times do NUMBER_OF_GUESTS.times do
guest = Guest.create!(first_name: Faker::Name.first_name, Guest.create!(
last_name: Faker::Name.last_name, first_name: Faker::Name.first_name,
email: Faker::Internet.email, last_name: Faker::Name.last_name,
phone: Faker::PhoneNumber.cell_phone) email: Faker::Internet.email,
phone: Faker::PhoneNumber.cell_phone,
guest.affinity_group_list.add(samples.sample) group: groups.sample
guest.save! )
end
# Add unbreakable bonds
Guest.affinity_group_counts.each do |group|
couples = (group.taggings_count / 4).floor
guests_involved = Guest.tagged_with(group.name).limit(couples * 2)
guests_involved.each_slice(2) do |a, b|
bond_name = "#{a.full_name} & #{b.full_name}"
a.unbreakable_bond_list.add(bond_name)
b.unbreakable_bond_list.add(bond_name)
a.save!
b.save!
end
end end