gaussblurinc
gaussblurinc

Reputation: 3682

Rails: Migration default value cannot be overwritten by create methods

I have an migration for new table:

class CreateContentCategories < ActiveRecord::Migration
  def change
    create_table :content_categories do |t|
      t.string :title, default: '', null: false

      t.timestamps null: false
    end
  end
end

When I try to create or find_or_create_by new records with options:

def self.assign_titles_to_app(titles, app)
  # somewhere inside ( class scope )
  title = 'movies'
  content_category = find_by_title(title) || create(title: title)
  puts "title: #{title} category: #{content_category.inspect}"

active record doesn't use my title

title: movies category: #<ContentCategory id: 1050, title: "", created_at: "2015-06-25 15:42:57", updated_at: "2015-06-25 15:42:57">

the same result for find_or_create_by:

title = 'movies'
content_category = find_or_create_by(title: title)
title: movies category: #<ContentCategory id: 1062, title: "", created_at: "2015-06-25 15:45:25", updated_at: "2015-06-25 15:45:25">

Documentation said:

:default - The column's default value. Use nil for NULL.

What is going wrong? how to fix it?

Info:

Update: I forgot about attr_accessible:

class ContentCategory < ActiveRecord::Base
# attr_accessible :title <- I forgot to add this line, oh
end

Upvotes: 1

Views: 78

Answers (1)

smathy
smathy

Reputation: 27961

There's nothing wrong with your code, maybe you need to restart your app (and spring) or maybe the problem is in code that you haven't shown. Just to demonstrate, I added your exact code to a vanilla 4.2 app and:

[9] pry(main)> ContentCategory.assign_titles_to_app 1, 2
  ContentCategory Load (0.2ms)  SELECT  "content_categories".* FROM "content_categories" WHERE "content_categories"."title" = ? LIMIT 1  [["title", "movies"]]
   (0.1ms)  begin transaction
  SQL (0.7ms)  INSERT INTO "content_categories" ("title", "created_at", "updated_at") VALUES (?, ?, ?)  [["title", "movies"], ["created_at", "2015-06-25 16:31:59.192793"], ["updated_at", "2015-06-25 16:31:59.192793"]]
   (0.5ms)  commit transaction
title: movies category: #<ContentCategory id: 1, title: "movies", created_at: "2015-06-25 16:31:59", updated_at: "2015-06-25 16:31:59">
=> nil

Upvotes: 2

Related Questions