我似乎无法解决这个问题。
我有一个用户模型。用户可以创建游览。用户还可以通过发送 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方法。
有人知道如何配置关系以便我能够正常工作吗?
答案 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。