用户与2个模型之间的关联

时间:2014-12-18 16:52:14

标签: ruby-on-rails ruby

我似乎无法解决这个问题。

我有一个用户模型。用户可以创建游览。用户还可以通过发送 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

我希望用户能够查看用户何时为他们创建的游览请求了tour_request。

我试过了:

current_user.tours.tour_requests.all

但是这给我留下了未定义的tour_requests方法。

有人知道如何配置关系以便我能够正常工作吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以迭代游览以获取请求,例如Craig提到的,或者您可以创建另一个关联,例如

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。