Ruby on Rails
Książka kucharska Railsów - Zaawansowane przepisy / nauka i techniki szynowe
Szukaj…
Gra ze stołami za pomocą konsoli szyn
Zobacz tabele
ActiveRecord::Base.connection.tables
Usuń dowolną tabelę .
ActiveRecord::Base.connection.drop_table("users")
------------OR----------------------
ActiveRecord::Migration.drop_table(:users)
------------OR---------------------
ActiveRecord::Base.connection.execute("drop table users")
Usuń indeks z istniejącej kolumny
ActiveRecord::Migration.remove_index(:users, :name => 'index_users_on_country')
gdzie country to nazwa kolumny w pliku migracji z już dodanym indeksem w tabeli users jak pokazano poniżej: -
t.string :country,add_index: true
Usuń ograniczenie klucza obcego
ActiveRecord::Base.connection.remove_foreign_key('food_items', 'menus')
gdzie menus has_many food_items i ich migracji.
Dodaj kolumnę
ActiveRecord::Migration.remove_column :table_name, :column_name
na przykład:-
ActiveRecord::Migration.add_column :profiles, :profile_likes, :integer, :default => 0
Metody Railsowe - zwracanie wartości boolowskich
Każda metoda w modelu Rails może zwrócić wartość logiczną.
prosta metoda
##this method return ActiveRecord::Relation
def check_if_user_profile_is_complete
User.includes( :profile_pictures,:address,:contact_detail).where("user.id = ?",self)
end
Ponownie prosta metoda zwracająca wartość logiczną
##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
Tak więc ta sama metoda zwróci teraz wartość logiczną zamiast czegokolwiek innego :).
Obsługa błędu - niezdefiniowana metoda `gdzie 'dla #
Czasami chcemy użyć zapytania where w kolekcji zwróconych rekordów, która nie jest ActiveRecord::Relation Dlatego otrzymujemy powyższy błąd, ponieważ klauzula Where jest znana dla ActiveRecord a nie dla Array .
Istnieje dokładne rozwiązanie tego problemu za pomocą Joins .
PRZYKŁAD : -
Załóżmy, że muszę znaleźć wszystkie profile użytkowników (UserProfile), które są aktywne, a nie użytkownik (Użytkownik) o id = 10.
UserProfiles.includes(:user=>:profile_pictures]).where(:active=>true).map(&:user).where.not(:id=>10)
Dlatego powyższe zapytanie nie powiedzie się po map ponieważ map zwróci array która nie będzie działać z klauzulą where .
Ale korzystanie z połączeń sprawi, że będzie działać,
UserProfiles.includes(:user=>:profile_pictures]).where(:active=>true).joins(:user).where.not(:id=>10)
Gdy joins wygenerują podobne rekordy, takie jak map ale będą to ActiveRecord a nie Array .