2014-12-18 2 views
1

Я не могу решить эту проблему.связь между пользователем и 2 моделями

У меня есть пользователь модель. Пользователь может создать тур. Пользователи также могут заказать туры других людей, отправив tour_request.

В настоящее время мои ассоциации таковы:

user.rb

has_many :tours 
has_many :tour_requests 

tour.rb

belongs_to :user 
has_many :tour_requests 

tour_request.rb

belongs_to :user 
belongs_to :tour 

Я хотел бы, чтобы у пользователя была возможность посмотреть, когда пользователь запросил тур_request для тура, который они создали.

Я пробовал:

current_user.tours.tour_requests.all 

но оставляет меня с неопределенным метода tour_requests.

Кто-нибудь знает, как я могу настроить отношения так, чтобы я мог получить эту работу?

ответ

0

Возможно, мне что-то не хватает, но почему вы пытаетесь добраться до tour_requests через tours? У вас есть связь на вашем user объекта:

current_user.tour_requests.each do |tour_request| ... end 

Кроме того, имейте в виду, что current_user.tours является результатом множества ActiveRecord (то есть, она содержит все объекты ActiveRecord тур). Таким образом, этот вызов никогда не будет работать.

По крайней мере, вам нужно будет что-то сделать в соответствии с приведенным ниже кодом. Конечно, есть много способов сделать это, но, в конечном счете, если вы хотите получить tour_requests от объекта tour, он должен быть у одного экземпляра tour, а не коллекции.

current_user.tours.each do |tour| 
    tour.tour_requests 
end 
+0

Если вы создали тур. Я хотел бы показать, кто запросил бронирование тура, который вы создали. Итак, если я создаю тур с id # 2, а вы, как другой пользователь, создадите запрос на тур для этого тура (id # 2), я бы хотел сказать, что Craig запросил тур для id # 2. – sja

+0

Думаю, я понимаю, что вам нужно ... тогда кажется, что вы захотите сделать это больше, чем мой второй блок кода, где вы перебираете тур_треки, связанные с каждым туром. Затем вы можете выполнить любые условные проверки внутри этого блока, чтобы узнать, запросил ли пользователь тур и т. Д. –

0

Вы можете перебрать туры, чтобы получить запросы, как Крейг отметил, или вы можете создать еще одну ассоциацию, как

class User 
    # ... 
    has_many users_tour_requests, through: :tours, source: :tour_requests 
end 

# then you have something like 
user.users_tour_requests 

Очевидно, что вы должны иметь отдельное название для этой новой ассоциации, как вы уже имеют существующую связь с именем tour_requests. Из-за этого вам нужно указать источник, который должен быть найден внутри ассоциации tours.

С has_many :through, когда вам нужно только получить ваши запросы на туры, он будет генерировать правильный запрос, чтобы получить их, а не сначала получать туры, а затем tour_requests.

Смежные вопросы