Nie mogę dowiedzieć się, jak użyć metody .where()
, aby pobrać powiązane dane modelu. W tym przykładzie, Projekty Użytkowników belongs_to ...Szyny 4: Sposób korzystania zawiera() z where() do pobierania powiązanych obiektów
class Project < ActiveRecord::Base
belongs_to :user
has_many :videos
end
class User < ActiveRecord::Base
has_many :projects
end
class ProjectsController < ApplicationController
def invite
@project = Project.includes([:user]).where({:hashed_id=>params[:id]}).first
end
w app/views/Projekty/invite.html.erg <%= debug(@project) %>
Powroty:
--- !ruby/object:Project
attributes:
id: 22
name: Some Project Name
belongs_to: 1
instructions: Bla bla bla
active: true
max_duration: 2
max_videos:
created_at: 2013-08-26 15:56:50.000000000 Z
updated_at: 2013-08-26 15:56:50.000000000 Z
hashed_id: '1377532589'
Gdyby nie wiąże się Użytkownik hash/array być włączone w tym? Wiem, że mogłem ręcznie dodać go, dzwoniąc po drugie find
/where
(@project.user = User.where({:id=>@project.belongs_to}
), ale to nie brzmi jak "The Rails Way". Co jest?
Rozwiązanie Moje pierwsze pytanie zostało sformułowane na podstawie błędnego założenia, że debug()
wróci powiązanych obiektów (to działa w CakePHP ponieważ wiązki wszystko pod tablicami).
Więc mój oryginalny kod powinien działać. Jednak nieprawidłowo nazwałem klucz obcy złożony w tabeli. Byłem zdezorientowany, patrząc na metodę migracji t.belongs_to
(która automatycznie tworzy poprawnie nazwane pole klucza obcego, , a nie w polu o nazwie "belongs_to"). Tak więc musiałem zmienić nazwę tej kolumny na user_id
i teraz działa ona tak, jak opisano w odpowiedzi @ Veraticus poniżej.
Co dokładnie próbujesz pokazywać? Czy masz na myśli, że chcesz wyświetlać dane wyjściowe debugowania pokazujące plik @ project.user? Czy mówisz, że twoje "gdzie" i "zawiera" nie działają? Jeśli chcesz pokazać powiązanie 'user' dla debugowania, czy wypróbowałeś' <% = debug (@ project.user)%> 'bez wykonywania dodatkowego' user.where ... '? – lurker
jeśli masz tylko jeden obiekt projektu obejmuje nie ma dla mnie sensu.obejmuje sens, gdy wybranych jest kilka projektów i chcesz załadować wszystkich odpowiednich użytkowników w jednym zapytaniu, czy to właśnie robiłeś? lub w jaki sposób używasz 'zawiera', mam nadzieję, że pamiętasz – juanpastas
Odpowiedzi nie są już tworzenie pojedynczego zapytania, ale to podejście ma: http://blog.arkency.com/2013/12/rails4-preloading/ – hakunin