Rail activation activity keeps data in wrong table
I have the following model
# app/models/admin/furniture/wood/type.rb
class Admin::Furniture::Wood::Type < ApplicationRecord
validates_presence_of :name
validates_uniqueness_of :name
end
but when i try to save the model it is stored in the wrong table! only this model is wrong, all other models work fine.
I don't understand what the problem is, I checked everything model path
, even specified the table name with self.table_name
nothing worked !! Why??
Edit:
Migration file:
# db/migrate/20170505064612_create_admin_furniture_wood_types.rb
class CreateAdminFurnitureWoodTypes < ActiveRecord::Migration[5.0]
def change
create_table :admin_furniture_wood_types do |t|
t.string :name
t.text :comment
t.timestamps
end
end
end
Database config file:
# config/database.yml
# MySQL. Versions 5.0 and up are supported.
#
# Install the MySQL driver
# gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
# gem 'mysql2'
#
# And be sure to use new-style password hashing:
# http://dev.mysql.com/doc/refman/5.7/en/old-client.html
#
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: root
password: root
socket: /var/run/mysqld/mysqld.sock
variables:
sql_mode: 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
development:
<<: *default
database: viramobl_development
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: viramobl_test
password: <%= ENV['TRAVIS'] ? '' : 'root' %>
# As with config/secrets.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
# DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
# production:
# url: <%= ENV['DATABASE_URL'] %>
#
production:
<<: *default
database: viramobl_production
username: viramobl
password: <%= ENV['VIRAMOBL_DATABASE_PASSWORD'] %>
source to share
This behavior is triggered when the database table has a column named type
or your model name ends with types
. In these cases, Rails uses methods and conventions for each table while saving the instances.
Just rename this model to something else that makes sense in your domain: Admin::Furniture::Wood::Kind
orAdmin::Furniture::Wood::Category
In addition, there is a convention in Rails that models are named in the singular and their tables are named in the plural. Think about it, as there is only one class with this name, but multiple instances of this class are stored in the table.
Whenever you name your classes that don't conform to these conventions, you must explicitly tell Rails to do so using the table_name=
.
source to share