Ruby on Rails
Rails Cookbook - Recetas / aprendizajes avanzados y técnicas de codificación
Buscar..
Jugando con mesas utilizando la consola de rieles.
Ver tablas
ActiveRecord::Base.connection.tables
Eliminar cualquier tabla .
ActiveRecord::Base.connection.drop_table("users")
------------OR----------------------
ActiveRecord::Migration.drop_table(:users)
------------OR---------------------
ActiveRecord::Base.connection.execute("drop table users")
Eliminar índice de la columna existente
ActiveRecord::Migration.remove_index(:users, :name => 'index_users_on_country')
donde country
es un nombre de columna en el archivo de migración con un índice ya agregado en la tabla de users
como se muestra a continuación:
t.string :country,add_index: true
Eliminar restricción de clave externa
ActiveRecord::Base.connection.remove_foreign_key('food_items', 'menus')
donde los menus has_many food_items
y menus has_many food_items
y sus respectivas migraciones también.
Añadir columna
ActiveRecord::Migration.remove_column :table_name, :column_name
por ejemplo:-
ActiveRecord::Migration.add_column :profiles, :profile_likes, :integer, :default => 0
Métodos de rieles - devolviendo valores booleanos
Cualquier método en el modelo de Rails puede devolver un valor booleano.
método simple
##this method return ActiveRecord::Relation
def check_if_user_profile_is_complete
User.includes( :profile_pictures,:address,:contact_detail).where("user.id = ?",self)
end
De nuevo, un método simple que devuelve valor booleano.
##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
Entonces, el mismo método ahora devolverá booleano en lugar de cualquier otra cosa :).
Manejo del error - método indefinido `donde 'para #
A veces queremos usar una consulta where
en una colección de registros devueltos que no es ActiveRecord::Relation
modo, obtenemos el error anterior, ya que la cláusula Where
es conocida para ActiveRecord
y no para Array
.
Hay una solución precisa para esto utilizando Joins
.
EJEMPLO : -
Supongamos que necesito encontrar todos los perfiles de usuario (UserProfile) que estén activos y no sean usuarios (User) con un id = 10.
UserProfiles.includes(:user=>:profile_pictures]).where(:active=>true).map(&:user).where.not(:id=>10)
Por lo tanto, la consulta anterior fallará después de que el map
como map
devuelva una array
que no funcionará con la cláusula where
.
Pero usar uniones, lo hará funcionar,
UserProfiles.includes(:user=>:profile_pictures]).where(:active=>true).joins(:user).where.not(:id=>10)
Dado que las joins
generarán registros similares como map
pero serán ActiveRecord
y no un Array
.