This commit is contained in:
Dylan Knutson
2025-07-18 21:39:51 +00:00
parent 04f6f78730
commit a526fb54f1
6 changed files with 82 additions and 3 deletions

View File

@@ -41,6 +41,7 @@ ActiveRecord::Schema.define do
to_table: :users_fa_aux, to_table: :users_fa_aux,
primary_key: :base_table_id primary_key: :base_table_id
} }
t.integer :category
t.integer :fa_id, index: true t.integer :fa_id, index: true
t.string :title t.string :title
t.string :species t.string :species
@@ -99,6 +100,7 @@ class FaPost < Post
belongs_to :creator, class_name: "FaUser", inverse_of: :created_posts belongs_to :creator, class_name: "FaUser", inverse_of: :created_posts
validates :fa_id, presence: true, uniqueness: true validates :fa_id, presence: true, uniqueness: true
validates :title, presence: true validates :title, presence: true
enum :category, { image: 0, video: 1, text: 2 }
end end
class E621Post < Post class E621Post < Post

View File

@@ -57,6 +57,7 @@ module HasAuxTable
setup_attributes_hook!(config) setup_attributes_hook!(config)
setup_relation_extensions!(config) setup_relation_extensions!(config)
setup_attribute_getter_setter_hooks!(config) setup_attribute_getter_setter_hooks!(config)
setup_enum_hook!(config)
config config
end end
@@ -198,9 +199,8 @@ module HasAuxTable
sig { params(load_schema_method: Method, config: AuxTableConfig).void } sig { params(load_schema_method: Method, config: AuxTableConfig).void }
def aux_config_load_schema!(load_schema_method, config) def aux_config_load_schema!(load_schema_method, config)
# first, load the main and aux table schemas like normal # first, load the main and aux table schemas like normal
result = load_schema_method.call
config.load_aux_schema config.load_aux_schema
result = load_schema_method.call
aux_table_name = config.aux_table_name aux_table_name = config.aux_table_name
check_for_overlapping_columns!( check_for_overlapping_columns!(
@@ -356,6 +356,49 @@ module HasAuxTable
"Auxiliary table columns must not overlap with main table columns." "Auxiliary table columns must not overlap with main table columns."
end end
end end
sig { params(config: AuxTableConfig).void }
def setup_enum_hook!(config)
self.define_singleton_method(
:enum
) do |name = nil, values = nil, **options, &block|
name = name.to_s
config.aux.klass.enum(name, values, **options, &block)
self.defined_enums.merge!(config.aux.klass.defined_enums)
# define methods on the main class that delegate to the aux class
config
.aux
.klass
.send(:_enum_methods_module)
.instance_methods
.each do |method_name|
self
._enum_methods_module
.define_method(method_name) do |*args, **kwargs, &block|
raise "not implemented"
end
end
define_singleton_method(name.pluralize) do
config.aux.klass.send(name.pluralize)
end
values.keys.each do |value_name|
value_name = [options[:prefix], value_name, options[:suffix]].reject(
&:blank?
).join("_")
[
value_name,
"#{value_name}?",
"#{value_name}!",
"#{value_name}="
].each do |method_name|
config.define_aux_attribute_delegate(method_name.to_sym)
end
end
end
end
end end
mixes_in_class_methods(ClassMethods) mixes_in_class_methods(ClassMethods)
end end

View File

@@ -121,7 +121,7 @@ module HasAuxTable
const :foreign_key, KeyType const :foreign_key, KeyType
const :primary_key, KeyType const :primary_key, KeyType
sig { void } sig { returns(T.untyped) }
def load_aux_schema def load_aux_schema
aux_class.load_schema aux_class.load_schema
end end

View File

@@ -111,6 +111,31 @@ RSpec.describe HasAuxTable do
expect(driver.car).to eq(car) expect(driver.car).to eq(car)
end end
it "defined_enums returns the correct values" do
engine_types = {
"turbofan" => 0,
"turboprop" => 1,
"piston" => 2,
"electric" => 3
}
expect(Plane.defined_enums).to eq({ "engine_type" => engine_types })
expect(Plane.engine_types).to eq(engine_types)
end
it "works with enums" do
plane = Plane.create!(name: "Boeing 747", engine_type: :turbofan)
expect(plane.engine_type).to eq("turbofan")
plane.engine_type = "piston"
expect(plane.engine_type).to eq("piston")
plane.save!
expect(plane.engine_type).to eq("piston")
expect(plane.piston?).to be_truthy
plane.turboprop!
expect(plane.engine_type).to eq("turboprop")
end
describe "#changed?" do describe "#changed?" do
it "returns true if the main record changes" do it "returns true if the main record changes" do
car = Car.create!(name: "Honda Civic") car = Car.create!(name: "Honda Civic")

View File

@@ -81,6 +81,10 @@ module SpecHelper
t.create_aux :boat do |t| t.create_aux :boat do |t|
t.boolean :only_freshwater t.boolean :only_freshwater
end end
t.create_aux :plane do |t|
t.integer :engine_type
end
end end
create_base_table :people do |t| create_base_table :people do |t|

View File

@@ -21,6 +21,11 @@ class Boat < Vehicle
belongs_to :captain, inverse_of: :boat belongs_to :captain, inverse_of: :boat
end end
class Plane < Vehicle
aux_table :plane
enum :engine_type, { turbofan: 0, turboprop: 1, piston: 2, electric: 3 }
end
class Person < ActiveRecord::Base class Person < ActiveRecord::Base
include HasAuxTable include HasAuxTable
self.table_name = "people" self.table_name = "people"