Skip to content

Instantly share code, notes, and snippets.

@rummelonp
Created March 26, 2014 09:59
Show Gist options
  • Save rummelonp/9780005 to your computer and use it in GitHub Desktop.
Save rummelonp/9780005 to your computer and use it in GitHub Desktop.
ActiveRecord で水平分割されてるの楽に扱うやつ
module HorizontalSplitNyan
def self.const_missing(const_name)
klass = Class.new(ActiveRecord::Base)
klass.table_name = "horizontal_split_nyans_#{const_name.to_s.downcase}"
const_set(const_name, klass)
end
def self.build(&block)
relations = table_classes.map { |c| c.instance_eval(&block) }
sql = relations.map { |r| r.to_sql }.join(' UNION ')
table_classes.first.from("(#{sql}) #{table_classes.first.table_name}")
end
def self.method_missing(method_name, *args, &block)
build { send(method_name, *args) }
end
def self.tables
tables = ActiveRecord::Base.connection.tables.select { |t| t =~ /\Ahorizontal_split_nyans_p\d{6}/ }
end
def self.table_classes
tables.map do |t|
_, year, month = *t.match(/horizontal_split_nyans_p(\d{4})(\d{2})/)
split_post_class = SplitPost.const_get("P#{year}#{month}")
end
end
end
@rummelonp
Copy link
Author

nyans = HorizontalSplitNyan.build { where(user_id: 1) }
nyan_count = HorizontalSplitNyan.build { where(user_id: 1) }.count

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment