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

时间:2014-05-31 11:00:26

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

我对rails有点新意,我遇到了问题,我试图找回一个"命题"控制器中的对象。

我的数据模型是: 用户 - >广告 - >命题

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

class Proposition < ActiveRecord::Base
belongs_to :ad
attr_accessible :email, :name
end

因此,我们在&#34; ad&#34;之间建立了联系。和&#34;命题&#34; (许多命题可以与广告相关联。)

以同样的方式,&#34;广告&#34;属于用户:

class Ad < ActiveRecord::Base
belongs_to :user
...

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

class RegistrationsController < Devise::RegistrationsController
def edit
@ads = current_user.ads

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

class RegistrationsController < Devise::RegistrationsController
def edit
@ads = current_user.ads
@propositions = current_user.ads.propositions

我收到以下错误消息:

undefined method `propositions' for #<ActiveRecord::Relation:0x007fee649009c0>

有什么猜测会发生什么?

由于

3 个答案:

答案 0 :(得分:6)

您遇到的错误是由您拥有关系引起的,而propositions(如果您的has_many :propositions类中有Ad)是在{{Ad的实例上定义的1}}。

所以这意味着

ad = Ad.first
ad.propositions

会有效,但current_user.ads.propositions不会。

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

在您的用户模型中写

class User
  has_many :ads
  has_many :propositions, through: :ads
end

确保Ad具有所需的关系:

class Ad
  belongs_to :user
  has_many :propositions
end

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

@propositions = current_user.propositions

答案 1 :(得分:0)

您需要定义关系的另一面才能使其正常工作:

class Ad
  has_many :propositions
end

现在,您的current_user.ads.propositions无论如何都无效,因为“提议”适用于单个广告。如果您希望能够为单个用户收集所有广告的所有提议,您可以创建一个方法,例如:

class User
  has_many :ads

  all_props = []
  def propositions
    ads.each {|ad| all_props += ad.propositions}
  end
end

答案 2 :(得分:0)

如果我错了,请纠正我,但从你的代码看起来,我认为你有一个数据库模型,用户有很多广告,广告有很多命题。您需要像这样定义数据库模型:

用户模型:

class User < ActiveRecord::Base
  has_many :ads
end

广告模式:

class Ad < ActiveRecord::Base
  has_many :propositions
  belongs_to :user #if you want to extract user with a specific ad
end

在您的注册控制器中,您需要执行以下操作:

class RegistrationsController < Devise::RegistrationsController
  def edit
    @ads = current_user.ads  #returns a collection of ads for current user
    @ad = current_user.ads.find(params[:id]) #find and returns your specific ad
    @propositions = @ad.propositions #returns a collection of propositions related to your ad
  end
end