mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
de6b4efa3e
In a multiple database application, associations can't join across databases. When set, this option tells Rails to make 2 or more queries rather than using joins for associations. Set the option on a has many through association: ```ruby class Dog has_many :treats, through: :humans, disable_joins: true has_many :humans end ``` Then instead of generating join SQL, two queries are used for `@dog.treats`: ``` SELECT "humans"."id" FROM "humans" WHERE "humans"."dog_id" = ? [["dog_id", 1]] SELECT "treats".* FROM "treats" WHERE "treats"."human_id" IN (?, ?, ?) [["human_id", 1], ["human_id", 2], ["human_id", 3]] ``` This code is extracted from a gem we use internally at GitHub which means the implementation here is used in production daily and isn't experimental. I often get the question "why can't Rails do this automatically" so I figured I'd include the answer in the commit. Rails can't do this automatically because associations are lazily loaded. `dog.treats` needs to load `Dog`, then `Human` and then `Treats`. When `dog.treats` is called Rails pre-generates the SQL that will be run and puts that information into a reflection object. Because the SQL parts are pre-generated, as soon as `dog.treats` is loaded it's too late to skip a join. The join is already available on the object and that join is what's run to load `treats` from `dog` through `humans`. I think the only way to avoid setting an option on the association is to rewrite how and when the SQL is generated for associations which is a large undertaking. Basically the way that Active Record associations are designed, it is currently impossible to have Rails figure out to not join (loading the association will cause the join to occur, and that join will raise an error if the models don't live in the same db). The original implementation was written by me and Aaron. Lee helped port over tests, and I refactored the extraction to better match Rails style. Co-authored-by: Lee Quarella <leequarella@gmail.com> Co-authored-by: Aaron Patterson <aaron@rubyonrails.org>
1286 lines
34 KiB
Ruby
1286 lines
34 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
ActiveRecord::Schema.define do
|
|
# ------------------------------------------------------------------- #
|
|
# #
|
|
# Please keep these create table statements in alphabetical order #
|
|
# unless the ordering matters. In which case, define them below. #
|
|
# #
|
|
# ------------------------------------------------------------------- #
|
|
|
|
create_table :accounts, force: true do |t|
|
|
t.references :firm, index: false
|
|
t.string :firm_name
|
|
t.integer :credit_limit
|
|
t.integer "a" * max_identifier_length
|
|
end
|
|
|
|
create_table :admin_accounts, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :admin_users, force: true do |t|
|
|
t.string :name
|
|
t.string :settings, null: true, limit: 1024
|
|
t.string :parent, null: true, limit: 1024
|
|
t.string :spouse, null: true, limit: 1024
|
|
t.string :configs, null: true, limit: 1024
|
|
# MySQL does not allow default values for blobs. Fake it out with a
|
|
# big varchar below.
|
|
t.string :preferences, null: true, default: "", limit: 1024
|
|
t.string :json_data, null: true, limit: 1024
|
|
t.string :json_data_empty, null: true, default: "", limit: 1024
|
|
t.text :params
|
|
t.references :account
|
|
end
|
|
|
|
create_table :aircraft, force: true do |t|
|
|
t.string :name
|
|
t.integer :wheels_count, default: 0, null: false
|
|
t.datetime :wheels_owned_at
|
|
end
|
|
|
|
create_table :articles, force: true do |t|
|
|
end
|
|
|
|
create_table :articles_magazines, force: true do |t|
|
|
t.references :article
|
|
t.references :magazine
|
|
end
|
|
|
|
create_table :articles_tags, force: true do |t|
|
|
t.references :article
|
|
t.references :tag
|
|
end
|
|
|
|
create_table :audit_logs, force: true do |t|
|
|
t.column :message, :string, null: false
|
|
t.column :developer_id, :integer, null: false
|
|
t.integer :unvalidated_developer_id
|
|
end
|
|
|
|
create_table :authors, force: true do |t|
|
|
t.string :name, null: false
|
|
t.references :author_address
|
|
t.references :author_address_extra
|
|
t.string :organization_id
|
|
t.string :owned_essay_id
|
|
end
|
|
|
|
create_table :author_addresses, force: true do |t|
|
|
end
|
|
|
|
add_foreign_key :authors, :author_addresses
|
|
|
|
create_table :author_favorites, force: true do |t|
|
|
t.column :author_id, :integer
|
|
t.column :favorite_author_id, :integer
|
|
end
|
|
|
|
create_table :auto_id_tests, force: true, id: false do |t|
|
|
t.primary_key :auto_id
|
|
t.integer :value
|
|
end
|
|
|
|
create_table :binaries, force: true do |t|
|
|
t.string :name
|
|
t.binary :data
|
|
t.binary :short_data, limit: 2048
|
|
t.blob :blob_data
|
|
end
|
|
|
|
create_table :birds, force: true do |t|
|
|
t.string :name
|
|
t.string :color
|
|
t.integer :pirate_id
|
|
end
|
|
|
|
create_table :books, id: :integer, force: true do |t|
|
|
default_zero = { default: 0 }
|
|
t.references :author
|
|
t.string :format
|
|
t.column :name, :string
|
|
t.column :status, :integer, **default_zero
|
|
t.column :last_read, :integer, **default_zero
|
|
t.column :nullable_status, :integer
|
|
t.column :language, :integer, **default_zero
|
|
t.column :author_visibility, :integer, **default_zero
|
|
t.column :illustrator_visibility, :integer, **default_zero
|
|
t.column :font_size, :integer, **default_zero
|
|
t.column :difficulty, :integer, **default_zero
|
|
t.column :cover, :string, default: "hard"
|
|
t.string :isbn
|
|
t.string :external_id
|
|
t.column :original_name, :string
|
|
t.datetime :published_on
|
|
t.boolean :boolean_status
|
|
t.index [:author_id, :name], unique: true
|
|
t.integer :tags_count, default: 0
|
|
t.index :isbn, where: "published_on IS NOT NULL", unique: true
|
|
t.index "(lower(external_id))", unique: true if supports_expression_index?
|
|
|
|
t.datetime :created_at
|
|
t.datetime :updated_at
|
|
t.date :updated_on
|
|
end
|
|
|
|
create_table :encrypted_books, id: :integer, force: true do |t|
|
|
t.references :author
|
|
t.string :format
|
|
t.column :name, :string
|
|
t.column :original_name, :string
|
|
|
|
t.datetime :created_at
|
|
t.datetime :updated_at
|
|
end
|
|
|
|
create_table :booleans, force: true do |t|
|
|
t.boolean :value
|
|
t.boolean :has_fun, null: false, default: false
|
|
end
|
|
|
|
create_table :bulbs, primary_key: "ID", force: true do |t|
|
|
t.integer :car_id
|
|
t.string :name
|
|
t.boolean :frickinawesome, default: false
|
|
t.string :color
|
|
end
|
|
|
|
create_table "CamelCase", force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :cars, force: true do |t|
|
|
t.string :name
|
|
t.integer :engines_count
|
|
t.integer :wheels_count, default: 0, null: false
|
|
t.datetime :wheels_owned_at
|
|
t.column :lock_version, :integer, null: false, default: 0
|
|
t.timestamps null: false
|
|
end
|
|
|
|
create_table :old_cars, id: :integer, force: true do |t|
|
|
end
|
|
|
|
create_table :carriers, force: true
|
|
|
|
create_table :carts, force: true, primary_key: [:shop_id, :id] do |t|
|
|
if current_adapter?(:Mysql2Adapter)
|
|
t.bigint :id, index: true, auto_increment: true, null: false
|
|
else
|
|
t.bigint :id, index: true, null: false
|
|
end
|
|
t.bigint :shop_id
|
|
t.string :title
|
|
end
|
|
|
|
create_table :categories, force: true do |t|
|
|
t.string :name, null: false
|
|
t.string :type
|
|
t.integer :categorizations_count
|
|
end
|
|
|
|
create_table :categories_posts, force: true do |t|
|
|
t.integer :category_id, null: false
|
|
t.integer :post_id, null: false
|
|
end
|
|
|
|
create_table :categorizations, force: true do |t|
|
|
t.column :category_id, :integer
|
|
t.string :named_category_name
|
|
t.column :post_id, :integer
|
|
t.column :author_id, :integer
|
|
t.column :special, :boolean
|
|
end
|
|
|
|
create_table :citations, force: true do |t|
|
|
t.references :book1
|
|
t.references :book2
|
|
t.references :citation
|
|
end
|
|
|
|
create_table :clubs, force: true do |t|
|
|
t.string :name
|
|
t.integer :category_id
|
|
end
|
|
|
|
create_table :collections, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :colnametests, force: true do |t|
|
|
t.integer :references, null: false
|
|
end
|
|
|
|
create_table :columns, force: true do |t|
|
|
t.references :record
|
|
end
|
|
|
|
create_table :comments, force: true do |t|
|
|
t.integer :post_id, null: false
|
|
# use VARCHAR2(4000) instead of CLOB datatype as CLOB data type has many limitations in
|
|
# Oracle SELECT WHERE clause which causes many unit test failures
|
|
if current_adapter?(:OracleAdapter)
|
|
t.string :body, null: false, limit: 4000
|
|
else
|
|
t.text :body, null: false
|
|
end
|
|
t.string :type
|
|
t.integer :label, default: 0
|
|
t.integer :tags_count, default: 0
|
|
t.integer :children_count, default: 0
|
|
t.integer :parent_id
|
|
t.references :author, polymorphic: true
|
|
# The type of the attribute is a string to make sure preload work when types don't match.
|
|
# See #14855.
|
|
t.string :resource_id
|
|
t.string :resource_type
|
|
t.integer :origin_id
|
|
t.string :origin_type
|
|
t.integer :developer_id
|
|
t.datetime :updated_at
|
|
t.datetime :deleted_at
|
|
t.integer :comments
|
|
t.integer :company
|
|
end
|
|
|
|
create_table :companies, force: true do |t|
|
|
t.string :type
|
|
t.references :firm, index: false
|
|
t.string :firm_name
|
|
t.string :name
|
|
t.bigint :client_of
|
|
t.bigint :rating, default: 1
|
|
t.integer :account_id
|
|
t.string :description, default: ""
|
|
t.index [:name, :rating], order: :desc
|
|
t.index [:name, :description], length: 10
|
|
t.index [:firm_id, :type, :rating], name: "company_index", length: { type: 10 }, order: { rating: :desc }
|
|
t.index [:firm_id, :type], name: "company_partial_index", where: "(rating > 10)"
|
|
t.index :name, name: "company_name_index", using: :btree
|
|
t.index "(CASE WHEN rating > 0 THEN lower(name) END) DESC", name: "company_expression_index" if supports_expression_index?
|
|
end
|
|
|
|
create_table :content, force: true do |t|
|
|
t.string :title
|
|
t.belongs_to :book
|
|
t.belongs_to :book_destroy_async
|
|
end
|
|
|
|
create_table :content_positions, force: true do |t|
|
|
t.integer :content_id
|
|
end
|
|
|
|
create_table :vegetables, force: true do |t|
|
|
t.string :name
|
|
t.integer :seller_id
|
|
t.string :custom_type
|
|
end
|
|
|
|
create_table :computers, force: true do |t|
|
|
t.string :system
|
|
t.integer :developer, null: false
|
|
t.integer :extendedWarranty, null: false
|
|
t.integer :timezone
|
|
t.timestamps
|
|
end
|
|
|
|
create_table :computers_developers, id: false, force: true do |t|
|
|
t.references :computer
|
|
t.references :developer
|
|
t.timestamps
|
|
end
|
|
|
|
create_table :contracts, force: true do |t|
|
|
t.references :developer, index: false
|
|
t.references :company, index: false
|
|
t.string :metadata
|
|
t.integer :count
|
|
end
|
|
|
|
create_table :customers, force: true do |t|
|
|
t.string :name
|
|
t.integer :balance, default: 0
|
|
t.string :address_street
|
|
t.string :address_city
|
|
t.string :address_country
|
|
t.string :gps_location
|
|
end
|
|
|
|
create_table :customer_carriers, force: true do |t|
|
|
t.references :customer
|
|
t.references :carrier
|
|
end
|
|
|
|
create_table :dashboards, force: true, id: false do |t|
|
|
t.string :dashboard_id
|
|
t.string :name
|
|
end
|
|
|
|
create_table :destroy_async_parents, force: true, id: false do |t|
|
|
t.primary_key :parent_id
|
|
t.string :name
|
|
t.integer :tags_count, default: 0
|
|
end
|
|
|
|
create_table :destroy_async_parent_soft_deletes, force: true do |t|
|
|
t.integer :tags_count, default: 0
|
|
t.boolean :deleted
|
|
end
|
|
|
|
create_table :discounts, force: true do |t|
|
|
t.integer :amount
|
|
end
|
|
|
|
create_table :dl_keyed_belongs_tos, force: true, id: false do |t|
|
|
t.primary_key :belongs_key
|
|
t.references :destroy_async_parent
|
|
end
|
|
|
|
create_table :dl_keyed_belongs_to_soft_deletes, force: true do |t|
|
|
t.references :destroy_async_parent_soft_delete, index: { name: :soft_del_parent }
|
|
t.boolean :deleted
|
|
end
|
|
|
|
create_table :dl_keyed_has_ones, force: true, id: false do |t|
|
|
t.primary_key :has_one_key
|
|
|
|
t.references :destroy_async_parent
|
|
t.references :destroy_async_parent_soft_delete
|
|
end
|
|
|
|
create_table :dl_keyed_has_manies, force: true, id: false do |t|
|
|
t.primary_key :many_key
|
|
t.references :destroy_async_parent
|
|
end
|
|
|
|
create_table :dl_keyed_has_many_throughs, force: true, id: false do |t|
|
|
t.primary_key :through_key
|
|
end
|
|
|
|
create_table :dl_keyed_joins, force: true, id: false do |t|
|
|
t.primary_key :joins_key
|
|
t.references :destroy_async_parent
|
|
t.references :dl_keyed_has_many_through
|
|
end
|
|
|
|
create_table :developers, force: true do |t|
|
|
t.string :name
|
|
t.string :first_name
|
|
t.integer :salary, default: 70000
|
|
t.references :firm, index: false
|
|
t.integer :mentor_id
|
|
if supports_datetime_with_precision?
|
|
t.datetime :legacy_created_at, precision: 6
|
|
t.datetime :legacy_updated_at, precision: 6
|
|
t.datetime :legacy_created_on, precision: 6
|
|
t.datetime :legacy_updated_on, precision: 6
|
|
else
|
|
t.datetime :legacy_created_at
|
|
t.datetime :legacy_updated_at
|
|
t.datetime :legacy_created_on
|
|
t.datetime :legacy_updated_on
|
|
end
|
|
end
|
|
|
|
create_table :developers_projects, force: true, id: false do |t|
|
|
t.integer :developer_id, null: false
|
|
t.integer :project_id, null: false
|
|
t.date :joined_on
|
|
t.integer :access_level, default: 1
|
|
end
|
|
|
|
create_table :dog_lovers, force: true do |t|
|
|
t.integer :trained_dogs_count, default: 0
|
|
t.integer :bred_dogs_count, default: 0
|
|
t.integer :dogs_count, default: 0
|
|
end
|
|
|
|
create_table :dogs, force: true do |t|
|
|
t.integer :trainer_id
|
|
t.integer :breeder_id
|
|
t.integer :dog_lover_id
|
|
t.string :alias
|
|
end
|
|
|
|
create_table :doubloons, force: true do |t|
|
|
t.integer :pirate_id
|
|
t.integer :weight
|
|
end
|
|
|
|
create_table :edges, force: true, id: false do |t|
|
|
t.column :source_id, :integer, null: false
|
|
t.column :sink_id, :integer, null: false
|
|
t.index [:source_id, :sink_id], unique: true, name: "unique_edge_index"
|
|
end
|
|
|
|
create_table :engines, force: true do |t|
|
|
t.references :car, index: false
|
|
end
|
|
|
|
create_table :entrants, force: true do |t|
|
|
t.string :name, null: false
|
|
t.integer :course_id, null: false
|
|
end
|
|
|
|
create_table :entries, force: true do |t|
|
|
t.string :entryable_type, null: false
|
|
t.integer :entryable_id, null: false
|
|
end
|
|
|
|
create_table :essays, force: true do |t|
|
|
t.string :type
|
|
t.string :name
|
|
t.string :writer_id
|
|
t.string :writer_type
|
|
t.string :category_id
|
|
t.string :author_id
|
|
t.references :book
|
|
end
|
|
|
|
create_table :events, force: true do |t|
|
|
t.string :title, limit: 5
|
|
end
|
|
|
|
create_table :eyes, force: true do |t|
|
|
end
|
|
|
|
create_table :families, force: true do |t|
|
|
end
|
|
|
|
create_table :family_trees, force: true do |t|
|
|
t.references :family
|
|
t.references :member
|
|
t.string :token
|
|
end
|
|
|
|
create_table :frogs, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :funny_jokes, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :cold_jokes, force: true do |t|
|
|
t.string :cold_name
|
|
end
|
|
|
|
create_table :friendships, force: true do |t|
|
|
t.integer :friend_id
|
|
t.integer :follower_id
|
|
end
|
|
|
|
create_table :goofy_string_id, force: true, id: false do |t|
|
|
t.string :id, null: false
|
|
t.string :info
|
|
end
|
|
|
|
create_table :having, force: true do |t|
|
|
t.string :where
|
|
end
|
|
|
|
create_table :guids, force: true do |t|
|
|
t.column :key, :string
|
|
end
|
|
|
|
create_table :guitars, force: true do |t|
|
|
t.string :color
|
|
end
|
|
|
|
create_table :inept_wizards, force: true do |t|
|
|
t.column :name, :string, null: false
|
|
t.column :city, :string, null: false
|
|
t.column :type, :string
|
|
end
|
|
|
|
create_table :integer_limits, force: true do |t|
|
|
t.integer :"c_int_without_limit"
|
|
(1..8).each do |i|
|
|
t.integer :"c_int_#{i}", limit: i
|
|
end
|
|
end
|
|
|
|
create_table :invoices, force: true do |t|
|
|
t.integer :balance
|
|
if supports_datetime_with_precision?
|
|
t.datetime :updated_at, precision: 6
|
|
else
|
|
t.datetime :updated_at
|
|
end
|
|
end
|
|
|
|
create_table :iris, force: true do |t|
|
|
t.references :eye
|
|
t.string :color
|
|
end
|
|
|
|
create_table :items, force: true do |t|
|
|
t.column :name, :string
|
|
end
|
|
|
|
create_table :jobs, force: true do |t|
|
|
t.integer :ideal_reference_id
|
|
end
|
|
|
|
create_table :jobs_pool, force: true, id: false do |t|
|
|
t.references :job, null: false, index: true
|
|
t.references :user, null: false, index: true
|
|
end
|
|
|
|
create_table :keyboards, force: true, id: false do |t|
|
|
t.primary_key :key_number
|
|
t.string :name
|
|
end
|
|
|
|
create_table :kitchens, force: true do |t|
|
|
end
|
|
|
|
create_table :legacy_things, force: true do |t|
|
|
t.integer :tps_report_number
|
|
t.integer :version, null: false, default: 0
|
|
end
|
|
|
|
create_table :lessons, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :lessons_students, id: false, force: true do |t|
|
|
t.references :lesson
|
|
t.references :student
|
|
end
|
|
|
|
create_table :students, force: true do |t|
|
|
t.string :name
|
|
t.boolean :active
|
|
t.integer :college_id
|
|
end
|
|
|
|
add_foreign_key :lessons_students, :students, on_delete: :cascade
|
|
|
|
create_table :lint_models, force: true
|
|
|
|
create_table :line_items, force: true do |t|
|
|
t.integer :invoice_id
|
|
t.integer :amount
|
|
end
|
|
|
|
create_table :line_item_discount_applications, force: true do |t|
|
|
t.integer :line_item_id
|
|
t.integer :discount_id
|
|
end
|
|
|
|
create_table :lions, force: true do |t|
|
|
t.integer :gender
|
|
t.boolean :is_vegetarian, default: false
|
|
end
|
|
|
|
create_table :lock_without_defaults, force: true do |t|
|
|
t.column :title, :string
|
|
t.column :lock_version, :integer
|
|
t.timestamps null: true
|
|
end
|
|
|
|
create_table :lock_without_defaults_cust, force: true do |t|
|
|
t.column :title, :string
|
|
t.column :custom_lock_version, :integer
|
|
t.timestamps null: true
|
|
end
|
|
|
|
create_table :magazines, force: true do |t|
|
|
end
|
|
|
|
create_table :mateys, id: false, force: true do |t|
|
|
t.column :pirate_id, :integer
|
|
t.column :target_id, :integer
|
|
t.column :weight, :integer
|
|
end
|
|
|
|
create_table :members, force: true do |t|
|
|
t.string :name
|
|
t.references :member_type, index: false
|
|
t.references :admittable, polymorphic: true, index: false
|
|
end
|
|
|
|
create_table :member_details, force: true do |t|
|
|
t.integer :member_id
|
|
t.integer :organization_id
|
|
t.string :extra_data
|
|
end
|
|
|
|
create_table :member_friends, force: true, id: false do |t|
|
|
t.integer :member_id
|
|
t.integer :friend_id
|
|
end
|
|
|
|
create_table :memberships, force: true do |t|
|
|
t.datetime :joined_on
|
|
t.integer :club_id, :member_id
|
|
t.boolean :favorite, default: false
|
|
t.integer :type
|
|
t.datetime :created_at
|
|
t.datetime :updated_at
|
|
end
|
|
|
|
create_table :member_types, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :mentors, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :messages, force: true do |t|
|
|
t.string :subject
|
|
end
|
|
|
|
create_table :minivans, force: true, id: false do |t|
|
|
t.string :minivan_id
|
|
t.string :name
|
|
t.string :speedometer_id
|
|
t.string :color
|
|
end
|
|
|
|
create_table :minimalistics, force: true do |t|
|
|
end
|
|
|
|
create_table :mixed_case_monkeys, force: true, id: false do |t|
|
|
t.primary_key :monkeyID
|
|
t.integer :fleaCount
|
|
end
|
|
|
|
create_table :mixins, force: true do |t|
|
|
t.integer :parent_id
|
|
t.integer :pos
|
|
t.datetime :created_at
|
|
t.datetime :updated_at
|
|
t.integer :lft
|
|
t.integer :rgt
|
|
t.integer :root_id
|
|
t.string :type
|
|
end
|
|
|
|
create_table :mice, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :movies, force: true, id: false do |t|
|
|
t.primary_key :movieid
|
|
t.string :name
|
|
end
|
|
|
|
create_table :notifications, force: true do |t|
|
|
t.string :message
|
|
end
|
|
|
|
create_table :numeric_data, force: true do |t|
|
|
t.decimal :bank_balance, precision: 10, scale: 2
|
|
t.decimal :big_bank_balance, precision: 15, scale: 2
|
|
t.decimal :unscaled_bank_balance, precision: 10
|
|
t.decimal :world_population, precision: 20, scale: 0
|
|
t.decimal :my_house_population, precision: 2, scale: 0
|
|
t.decimal :decimal_number
|
|
t.decimal :decimal_number_with_default, precision: 3, scale: 2, default: 2.78
|
|
t.numeric :numeric_number
|
|
t.float :temperature
|
|
t.decimal :decimal_number_big_precision, precision: 20
|
|
# Oracle/SQLServer supports precision up to 38
|
|
if current_adapter?(:OracleAdapter, :SQLServerAdapter)
|
|
t.decimal :atoms_in_universe, precision: 38, scale: 0
|
|
else
|
|
t.decimal :atoms_in_universe, precision: 55, scale: 0
|
|
end
|
|
end
|
|
|
|
create_table :orders, force: true do |t|
|
|
t.string :name
|
|
t.integer :billing_customer_id
|
|
t.integer :shipping_customer_id
|
|
end
|
|
|
|
create_table :organizations, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :owners, primary_key: :owner_id, force: true do |t|
|
|
t.string :name
|
|
if supports_datetime_with_precision?
|
|
t.column :updated_at, :datetime, precision: 6
|
|
else
|
|
t.column :updated_at, :datetime
|
|
end
|
|
t.column :happy_at, :datetime
|
|
t.string :essay_id
|
|
end
|
|
|
|
create_table :paint_colors, force: true do |t|
|
|
t.integer :non_poly_one_id
|
|
end
|
|
|
|
create_table :paint_textures, force: true do |t|
|
|
t.integer :non_poly_two_id
|
|
end
|
|
|
|
disable_referential_integrity do
|
|
create_table :parrots, force: :cascade do |t|
|
|
t.string :name
|
|
t.string :color
|
|
t.string :parrot_sti_class
|
|
t.integer :killer_id
|
|
t.integer :updated_count, :integer, default: 0
|
|
if supports_datetime_with_precision?
|
|
t.datetime :created_at, precision: 0
|
|
t.datetime :created_on, precision: 0
|
|
t.datetime :updated_at, precision: 0
|
|
t.datetime :updated_on, precision: 0
|
|
else
|
|
t.datetime :created_at
|
|
t.datetime :created_on
|
|
t.datetime :updated_at
|
|
t.datetime :updated_on
|
|
end
|
|
end
|
|
|
|
create_table :pirates, force: :cascade do |t|
|
|
t.string :catchphrase
|
|
t.integer :parrot_id
|
|
t.integer :non_validated_parrot_id
|
|
if supports_datetime_with_precision?
|
|
t.datetime :created_on, precision: 6
|
|
t.datetime :updated_on, precision: 6
|
|
else
|
|
t.datetime :created_on
|
|
t.datetime :updated_on
|
|
end
|
|
end
|
|
|
|
create_table :treasures, force: :cascade do |t|
|
|
t.string :name
|
|
t.string :type
|
|
t.references :looter, polymorphic: true
|
|
t.references :ship
|
|
end
|
|
|
|
create_table :parrots_pirates, id: false, force: true do |t|
|
|
t.references :parrot, foreign_key: true
|
|
t.references :pirate, foreign_key: true
|
|
end
|
|
|
|
# used by tests that do `Parrot.has_and_belongs_to_many :treasures` (the default)
|
|
create_table :parrots_treasures, id: false, force: true do |t|
|
|
t.references :parrot, foreign_key: true
|
|
t.references :treasure, foreign_key: true
|
|
end
|
|
|
|
# used by tests that do `Parrot.has_many :treasures, through: :parrot_treasures`, and don't want to override the through relation's `table_name`
|
|
create_table :parrot_treasures, id: false, force: true do |t|
|
|
t.references :parrot, foreign_key: true
|
|
t.references :treasure, foreign_key: true
|
|
end
|
|
end
|
|
|
|
create_table :people, force: true do |t|
|
|
t.string :first_name, null: false
|
|
t.references :primary_contact
|
|
t.string :gender, limit: 1
|
|
t.references :number1_fan
|
|
t.integer :lock_version, null: false, default: 0
|
|
t.string :comments
|
|
t.integer :followers_count, default: 0
|
|
t.integer :friends_too_count, default: 0
|
|
t.references :best_friend
|
|
t.references :best_friend_of
|
|
t.integer :insures, null: false, default: 0
|
|
t.timestamp :born_at
|
|
t.timestamps null: false
|
|
end
|
|
|
|
create_table :peoples_treasures, id: false, force: true do |t|
|
|
t.column :rich_person_id, :integer
|
|
t.column :treasure_id, :integer
|
|
end
|
|
|
|
create_table :personal_legacy_things, force: true do |t|
|
|
t.integer :tps_report_number
|
|
t.integer :person_id
|
|
t.integer :version, null: false, default: 0
|
|
end
|
|
|
|
create_table :pets, primary_key: :pet_id, force: true do |t|
|
|
t.string :name
|
|
t.integer :owner_id, :integer
|
|
t.timestamps
|
|
end
|
|
|
|
create_table :pets_treasures, force: true do |t|
|
|
t.column :treasure_id, :integer
|
|
t.column :pet_id, :integer
|
|
t.column :rainbow_color, :string
|
|
end
|
|
|
|
create_table :posts, force: true do |t|
|
|
t.references :author
|
|
t.string :title, null: false
|
|
# use VARCHAR2(4000) instead of CLOB datatype as CLOB data type has many limitations in
|
|
# Oracle SELECT WHERE clause which causes many unit test failures
|
|
if current_adapter?(:OracleAdapter)
|
|
t.string :body, null: false, limit: 4000
|
|
else
|
|
t.text :body, null: false
|
|
end
|
|
t.string :type
|
|
t.integer :legacy_comments_count, default: 0
|
|
t.integer :taggings_with_delete_all_count, default: 0
|
|
t.integer :taggings_with_destroy_count, default: 0
|
|
t.integer :tags_count, default: 0
|
|
t.integer :indestructible_tags_count, default: 0
|
|
t.integer :tags_with_destroy_count, default: 0
|
|
t.integer :tags_with_nullify_count, default: 0
|
|
end
|
|
|
|
create_table :postesques, force: true do |t|
|
|
t.string :author_name
|
|
t.string :author_id
|
|
end
|
|
|
|
create_table :serialized_posts, force: true do |t|
|
|
t.integer :author_id
|
|
t.string :title, null: false
|
|
end
|
|
|
|
create_table :images, force: true do |t|
|
|
t.integer :imageable_identifier
|
|
t.string :imageable_class
|
|
end
|
|
|
|
create_table :price_estimates, force: true do |t|
|
|
t.string :estimate_of_type
|
|
t.integer :estimate_of_id
|
|
t.integer :price
|
|
t.string :currency
|
|
end
|
|
|
|
create_table :products, force: true do |t|
|
|
t.references :collection
|
|
t.references :type
|
|
t.string :name
|
|
t.decimal :price
|
|
t.decimal :discounted_price
|
|
end
|
|
|
|
add_check_constraint :products, "price > discounted_price", name: "products_price_check"
|
|
|
|
create_table :product_types, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :projects, force: true do |t|
|
|
t.string :name
|
|
t.string :type
|
|
t.references :firm, index: false
|
|
t.integer :mentor_id
|
|
end
|
|
|
|
create_table :randomly_named_table1, force: true do |t|
|
|
t.string :some_attribute
|
|
t.integer :another_attribute
|
|
end
|
|
|
|
create_table :randomly_named_table2, force: true do |t|
|
|
t.string :some_attribute
|
|
t.integer :another_attribute
|
|
end
|
|
|
|
create_table :randomly_named_table3, force: true do |t|
|
|
t.string :some_attribute
|
|
t.integer :another_attribute
|
|
end
|
|
|
|
create_table :ratings, force: true do |t|
|
|
t.integer :comment_id
|
|
t.integer :value
|
|
end
|
|
|
|
create_table :readers, force: true do |t|
|
|
t.integer :post_id, null: false
|
|
t.integer :person_id, null: false
|
|
t.boolean :skimmer, default: false
|
|
t.integer :first_post_id
|
|
end
|
|
|
|
create_table :references, force: true do |t|
|
|
t.integer :person_id
|
|
t.integer :job_id
|
|
t.boolean :favorite
|
|
t.integer :lock_version, default: 0
|
|
end
|
|
|
|
create_table :rooms, force: true do |t|
|
|
t.references :user
|
|
t.references :owner
|
|
end
|
|
|
|
disable_referential_integrity do
|
|
create_table :seminars, force: :cascade do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :sessions, force: :cascade do |t|
|
|
t.date :start_date
|
|
t.date :end_date
|
|
t.string :name
|
|
end
|
|
|
|
create_table :sections, force: :cascade do |t|
|
|
t.string :short_name
|
|
t.belongs_to :session, foreign_key: true
|
|
t.belongs_to :seminar, foreign_key: true
|
|
end
|
|
end
|
|
|
|
create_table :shape_expressions, force: true do |t|
|
|
t.string :paint_type
|
|
t.integer :paint_id
|
|
t.string :shape_type
|
|
t.integer :shape_id
|
|
end
|
|
|
|
create_table :shipping_lines, force: true do |t|
|
|
t.integer :invoice_id
|
|
t.integer :amount
|
|
end
|
|
|
|
create_table :shipping_line_discount_applications, force: true do |t|
|
|
t.integer :shipping_line_id
|
|
t.integer :discount_id
|
|
end
|
|
|
|
create_table :ships, force: true do |t|
|
|
t.string :name
|
|
t.integer :pirate_id
|
|
t.belongs_to :developer
|
|
t.integer :update_only_pirate_id
|
|
# Conventionally named column for counter_cache
|
|
t.integer :treasures_count, default: 0
|
|
t.datetime :created_at
|
|
t.datetime :created_on
|
|
t.datetime :updated_at
|
|
t.datetime :updated_on
|
|
end
|
|
|
|
create_table :ship_parts, force: true do |t|
|
|
t.string :name
|
|
t.integer :ship_id
|
|
if supports_datetime_with_precision?
|
|
t.datetime :updated_at, precision: 6
|
|
else
|
|
t.datetime :updated_at
|
|
end
|
|
end
|
|
|
|
create_table :squeaks, force: true do |t|
|
|
t.integer :mouse_id
|
|
end
|
|
|
|
create_table :prisoners, force: true do |t|
|
|
t.belongs_to :ship
|
|
end
|
|
|
|
create_table :sinks, force: true do |t|
|
|
t.references :kitchen
|
|
end
|
|
|
|
create_table :shop_accounts, force: true do |t|
|
|
t.references :customer
|
|
t.references :customer_carrier
|
|
end
|
|
|
|
create_table :speedometers, force: true, id: false do |t|
|
|
t.string :speedometer_id
|
|
t.string :name
|
|
t.string :dashboard_id
|
|
end
|
|
|
|
create_table :sponsors, force: true do |t|
|
|
t.integer :club_id
|
|
t.references :sponsorable, polymorphic: true, index: false
|
|
t.references :sponsor, polymorphic: true, index: false
|
|
end
|
|
|
|
create_table :string_key_objects, id: false, force: true do |t|
|
|
t.string :id, null: false
|
|
t.string :name
|
|
t.integer :lock_version, null: false, default: 0
|
|
t.index :id, unique: true
|
|
end
|
|
|
|
create_table :subscribers, id: false, force: true do |t|
|
|
t.string :nick, null: false
|
|
t.string :name
|
|
t.integer :id
|
|
t.integer :books_count, null: false, default: 0
|
|
t.integer :update_count, null: false, default: 0
|
|
t.index :nick, unique: true
|
|
end
|
|
|
|
create_table :subscriptions, force: true do |t|
|
|
t.string :subscriber_id
|
|
t.integer :book_id
|
|
end
|
|
|
|
create_table :tags, force: true do |t|
|
|
t.column :name, :string
|
|
t.column :taggings_count, :integer, default: 0
|
|
end
|
|
|
|
create_table :taggings, force: true do |t|
|
|
t.column :tag_id, :integer
|
|
t.column :super_tag_id, :integer
|
|
t.column :taggable_type, :string
|
|
t.column :taggable_id, :integer
|
|
t.string :comment
|
|
t.string :type
|
|
end
|
|
|
|
create_table :tasks, force: true do |t|
|
|
t.datetime :starting
|
|
t.datetime :ending
|
|
end
|
|
|
|
create_table :topics, force: true do |t|
|
|
t.string :title, limit: 250
|
|
t.string :author_name
|
|
t.string :author_email_address
|
|
if supports_datetime_with_precision?
|
|
t.datetime :written_on, precision: 6
|
|
else
|
|
t.datetime :written_on
|
|
end
|
|
t.time :bonus_time
|
|
t.date :last_read
|
|
# use VARCHAR2(4000) instead of CLOB datatype as CLOB data type has many limitations in
|
|
# Oracle SELECT WHERE clause which causes many unit test failures
|
|
if current_adapter?(:OracleAdapter)
|
|
t.string :content, limit: 4000
|
|
t.string :important, limit: 4000
|
|
else
|
|
t.text :content
|
|
t.text :important
|
|
end
|
|
t.boolean :approved, default: true
|
|
t.integer :replies_count, default: 0
|
|
t.integer :unique_replies_count, default: 0
|
|
t.integer :parent_id
|
|
t.string :parent_title
|
|
t.string :type
|
|
t.string :group
|
|
t.timestamps null: true
|
|
t.index [:author_name, :title]
|
|
end
|
|
|
|
create_table :toys, primary_key: :toy_id, force: true do |t|
|
|
t.string :name
|
|
t.integer :pet_id, :integer
|
|
t.timestamps null: false
|
|
end
|
|
|
|
create_table :traffic_lights, force: true do |t|
|
|
t.string :location
|
|
t.string :state
|
|
t.text :long_state, null: false
|
|
t.datetime :created_at
|
|
t.datetime :updated_at
|
|
end
|
|
|
|
create_table :tuning_pegs, force: true do |t|
|
|
t.integer :guitar_id
|
|
t.float :pitch
|
|
end
|
|
|
|
create_table :tyres, force: true do |t|
|
|
t.integer :car_id
|
|
end
|
|
|
|
create_table :unused_destroy_asyncs, force: true do |t|
|
|
end
|
|
|
|
create_table :unused_belongs_to, force: true do |t|
|
|
t.belongs_to :unused_destroy_async
|
|
end
|
|
|
|
create_table :variants, force: true do |t|
|
|
t.references :product
|
|
t.string :name
|
|
end
|
|
|
|
create_table :vertices, force: true do |t|
|
|
t.column :label, :string
|
|
end
|
|
|
|
create_table "warehouse-things", force: true do |t|
|
|
t.integer :value
|
|
end
|
|
|
|
[:circles, :squares, :triangles, :non_poly_ones, :non_poly_twos].each do |t|
|
|
create_table(t, force: true) { }
|
|
end
|
|
|
|
create_table :humans, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :faces, force: true do |t|
|
|
t.string :description
|
|
t.integer :human_id
|
|
t.integer :polymorphic_human_id
|
|
t.string :polymorphic_human_type
|
|
t.integer :poly_human_without_inverse_id
|
|
t.string :poly_human_without_inverse_type
|
|
t.integer :puzzled_polymorphic_human_id
|
|
t.string :puzzled_polymorphic_human_type
|
|
t.references :super_human, polymorphic: true, index: false
|
|
end
|
|
|
|
create_table :interests, force: true do |t|
|
|
t.string :topic
|
|
t.integer :human_id
|
|
t.integer :polymorphic_human_id
|
|
t.string :polymorphic_human_type
|
|
t.integer :zine_id
|
|
end
|
|
|
|
create_table :zines, force: true do |t|
|
|
t.string :title
|
|
end
|
|
|
|
create_table :strict_zines, force: true do |t|
|
|
t.string :title
|
|
end
|
|
|
|
create_table :wheels, force: true do |t|
|
|
t.integer :size
|
|
t.references :wheelable, polymorphic: true
|
|
end
|
|
|
|
create_table :countries, force: true, id: false do |t|
|
|
t.string :country_id, primary_key: true
|
|
t.string :name
|
|
end
|
|
|
|
create_table :treaties, force: true, id: false do |t|
|
|
t.string :treaty_id, primary_key: true
|
|
t.string :name
|
|
end
|
|
|
|
create_table :countries_treaties, force: true, primary_key: [:country_id, :treaty_id] do |t|
|
|
t.string :country_id, null: false
|
|
t.string :treaty_id, null: false
|
|
end
|
|
|
|
create_table :liquid, force: true do |t|
|
|
t.string :name
|
|
end
|
|
create_table :molecules, force: true do |t|
|
|
t.integer :liquid_id
|
|
t.string :name
|
|
end
|
|
create_table :electrons, force: true do |t|
|
|
t.integer :molecule_id
|
|
t.string :name
|
|
end
|
|
create_table :weirds, force: true do |t|
|
|
t.string "a$b"
|
|
t.string "なまえ"
|
|
t.string "from"
|
|
end
|
|
|
|
create_table :nodes, force: true do |t|
|
|
t.integer :tree_id
|
|
t.integer :parent_id
|
|
t.string :name
|
|
t.datetime :updated_at
|
|
end
|
|
create_table :trees, force: true do |t|
|
|
t.string :name
|
|
t.datetime :updated_at
|
|
end
|
|
|
|
create_table :hotels, force: true do |t|
|
|
end
|
|
create_table :departments, force: true do |t|
|
|
t.integer :hotel_id
|
|
end
|
|
create_table :cake_designers, force: true do |t|
|
|
end
|
|
create_table :drink_designers, force: true do |t|
|
|
t.string :name
|
|
end
|
|
create_table :chefs, force: true do |t|
|
|
t.integer :employable_id
|
|
t.string :employable_type
|
|
t.integer :department_id
|
|
t.string :employable_list_type
|
|
t.integer :employable_list_id
|
|
t.timestamps
|
|
end
|
|
create_table :recipes, force: true do |t|
|
|
t.integer :chef_id
|
|
t.integer :hotel_id
|
|
end
|
|
|
|
create_table :records, force: true do |t|
|
|
end
|
|
|
|
disable_referential_integrity do
|
|
create_table :fk_test_has_pk, primary_key: "pk_id", force: :cascade do |t|
|
|
end
|
|
|
|
create_table :fk_test_has_fk, force: true do |t|
|
|
t.references :fk, null: false
|
|
t.foreign_key :fk_test_has_pk, column: "fk_id", name: "fk_name", primary_key: "pk_id"
|
|
end
|
|
end
|
|
|
|
create_table :overloaded_types, force: true do |t|
|
|
t.float :overloaded_float, default: 500
|
|
t.float :unoverloaded_float
|
|
t.string :overloaded_string_with_limit, limit: 255
|
|
t.string :string_with_default, default: "the original default"
|
|
t.string :inferred_string, limit: 255
|
|
t.datetime :starts_at, :ends_at
|
|
end
|
|
|
|
create_table :users, force: true do |t|
|
|
t.string :token
|
|
t.string :auth_token
|
|
end
|
|
|
|
create_table :test_with_keyword_column_name, force: true do |t|
|
|
t.string :desc
|
|
end
|
|
|
|
create_table :non_primary_keys, force: true, id: false do |t|
|
|
t.integer :id
|
|
t.datetime :created_at
|
|
end
|
|
end
|
|
|
|
Course.connection.create_table :courses, force: true do |t|
|
|
t.column :name, :string, null: false
|
|
t.column :college_id, :integer
|
|
end
|
|
|
|
College.connection.create_table :colleges, force: true do |t|
|
|
t.column :name, :string, null: false
|
|
end
|
|
|
|
Professor.connection.create_table :professors, force: true do |t|
|
|
t.column :name, :string, null: false
|
|
end
|
|
|
|
Professor.connection.create_table :courses_professors, id: false, force: true do |t|
|
|
t.references :course
|
|
t.references :professor
|
|
end
|
|
|
|
OtherDog.connection.create_table :dogs, force: true
|