enums
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user