Ruby on Rails

Rails Cookbook - Advanced rails recipes/learnings and coding techniques

Playing with Tables using rails console


View tables

ActiveRecord::Base.connection.tables

Delete any table.

    ActiveRecord::Base.connection.drop_table("users")
    ------------OR----------------------
    ActiveRecord::Migration.drop_table(:users)
    ------------OR---------------------
    ActiveRecord::Base.connection.execute("drop table users")

Remove index from existing column

 ActiveRecord::Migration.remove_index(:users, :name => 'index_users_on_country')

where country is a column name in the migration file with already added index in users table as shown below:-

 t.string :country,add_index: true

Remove foreign key constraint

ActiveRecord::Base.connection.remove_foreign_key('food_items', 'menus')

where menus has_many food_items and their respective migrations too.

Add column

ActiveRecord::Migration.remove_column :table_name, :column_name

for example:-

 ActiveRecord::Migration.add_column :profiles, :profile_likes, :integer, :default => 0

Rails methods - returning boolean values

Any method in Rails model can return boolean value.

simple method-

  ##this method return ActiveRecord::Relation
  def check_if_user_profile_is_complete
    User.includes( :profile_pictures,:address,:contact_detail).where("user.id = ?",self)
  end

Again simple method returning boolean value-

  ##this method return Boolean(NOTE THE !! signs before result)
  def check_if_user_profile_is_complete
    !!User.includes( :profile_pictures,:address,:contact_detail).where("user.id = ?",self)
  end

So,the same method will now return boolean instead of anything else :).

Handling the error - undefined method `where’ for #Array:0x000000071923f8

Sometimes we want to use a where query on a a collection of records returned which is not ActiveRecord::Relation.Hence we get the above error as Where clause is know to ActiveRecord and not to Array.

There is a precise solution for this by using Joins.

EXAMPLE:-

Suppose i need to find all user profiles(UserProfile) which are active which is not a user(User) with an id=10.

UserProfiles.includes(:user=>:profile_pictures]).where(:active=>true).map(&:user).where.not(:id=>10)

So above query will fail after map as map will return an array which will not work with where clause.

But using joins,will make it work,

UserProfiles.includes(:user=>:profile_pictures]).where(:active=>true).joins(:user).where.not(:id=>10)

As joins will output similar records like map but they will be ActiveRecord and not an Array.


This modified text is an extract of the original Stack Overflow Documentation created by the contributors and released under CC BY-SA 3.0 This website is not affiliated with Stack Overflow