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
.