Wpis z mikrobloga

#ror #ruby #rubyonrails #webdev
Hej mirki, mam problem.
Mam trzy modele - Film, Użytkownika oraz Zamówienie.
Model Zamówienie to tabela łączona (has_many :through) pomiędzy filmami i użytkownikami (relacja wielu-do-wielu). Ta tablica łączona ma jednak dodatkowe pola (np. status - zrealizowane bądź nie). Powiedzmy, że mam użytkownika oraz film - jak teraz napisać w kontrolerze instrukcje, które pozwolą mi na stworzenie tej tabeli Zamówienie z dodatkowym parametrem? samo
user.movies << movies (tak, ogólnie to po angielsku piszę :P )
Mnie nie urządza. Wiem, że mogę zrobić user.orders, ale jak wtedy wyciągnąć odpowiedni order?
  • 9
@przemkow:
Serio? Wiadomo, nowe ładniejsze i szybsze w pisaniu, ale o taką syntaktyczną pierdołę zwracać uwagę? :)
Jedynie chyba jako symbol tego, że człowiek nie jest na bieżąco z rozwojem technologii.

@Daronk:
Co do wymienionej własnie wyżej nowej składni - Order.create!(user: user, movie: movie, status: 'new')
@Ragnarokk: Spoko, używam nowej składni więc nawet z automatu to napisałem tak, jak proponujesz. Mam jeszcze jedną zagwozdkę. Czy da się to zrobić jakoś optymalnie
def usermovies
user = User.find(current
user.id)
orders = user.orders.where("status = true")
moviesids = []
orders.each do |order|
movies
ids << order.movieid
end
@movies = Movie.where(id: movies
ids)
end

W skrócie wyciągam z orderów, w których status jest true (jak mi wróci callback z
@Daronk:
user = User.find(currentuser.id) - zbędne, do wywalenia. Używasz current_user :)

Można to na pewno skrócić wybieranie moviesids mapem:

movies_ids = user.orders.where("status = true").map(&:movie_id)
Dodatkowo takie coś "orders.where("status = true")" najlepiej przerzucić do modelu jako scope. Daje to kod bardziej DRY
No i zapytania do bazy masz tutaj dwa - przy pobieraniu movie_id z orderu już nie sięga do bazy danych

Nie wiem, czy dobrze zrozumiałem, ale reasumując, ja bym