无法从控制器检索嵌套关联

ske*_*sse 2 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我对rails很新,我遇到问题我试图在控制器中检索一个"命题"对象.

我的数据模型是:user - > ad - > proposition

所以我创建了以下"命题"模型:

class Proposition < ActiveRecord::Base
belongs_to :ad
attr_accessible :email, :name
end
Run Code Online (Sandbox Code Playgroud)

因此,我们在"广告"和"命题"之间存在关联(许多命题可以与广告相关联).

同样,"广告"属于用户:

class Ad < ActiveRecord::Base
belongs_to :user
...
Run Code Online (Sandbox Code Playgroud)

我尝试从给定用户检索广告时没问题:

class RegistrationsController < Devise::RegistrationsController
def edit
@ads = current_user.ads
Run Code Online (Sandbox Code Playgroud)

但是当我尝试检索相关命题时:

class RegistrationsController < Devise::RegistrationsController
def edit
@ads = current_user.ads
@propositions = current_user.ads.propositions
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

undefined method `propositions' for #<ActiveRecord::Relation:0x007fee649009c0>
Run Code Online (Sandbox Code Playgroud)

有什么猜测发生了什么?

谢谢

nat*_*vda 6

你所拥有的错误是由你有关系的事实造成的,并且propositions(如果你有has_many :propositions你的Ad班级)是在一个实例上定义的Ad.

所以这意味着

ad = Ad.first
ad.propositions
Run Code Online (Sandbox Code Playgroud)

会工作,但current_user.ads.propositions不会.

我假设您希望通过广告找到与用户相关联的所有提议.在这种情况下,修复非常简单.

在你的用户模型中写

class User
  has_many :ads
  has_many :propositions, through: :ads
end
Run Code Online (Sandbox Code Playgroud)

确保Ad有必要的关系:

class Ad
  belongs_to :user
  has_many :propositions
end
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中,你可以写

@propositions = current_user.propositions
Run Code Online (Sandbox Code Playgroud)