【问题标题】:Impossible to retrieve nested association from controller无法从控制器中检索嵌套关联
【发布时间】:2014-05-31 11:00:25
【问题描述】:

我对 Rails 有点陌生,但在尝试在控制器中检索“命题”对象时遇到问题。

我的数据模型是: 用户 -> 广告 -> 提议

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

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

因此,我们在“广告”和“命题”之间建立了关联(许多命题可以与广告相关联)。

同样,“广告”属于用户:

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>

你猜怎么回事?

谢谢

【问题讨论】:

  • 您发布的Ad 模型是您的full code 吗?
  • 你的数据库模型是这样的吗:一个用户有很多广告,一个广告有很多介词?

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


【解决方案1】:

您遇到的错误是由于您有关系,并且propositions(如果您的Ad 类中有has_many :propositions)是在Ad 的实例上定义的。

所以这意味着

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

【讨论】:

  • 正是我想要的,非常感谢你的快速回答 nathanvda。效果很好。
【解决方案2】:

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

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

【讨论】:

  • 他肯定需要它,但这不起作用:) 添加propositions 关系,仅在Ad 的单个实例上定义它。
  • 您可能是对的 - 'current_user.ads.propositions' 无论如何都不会起作用。我会相应地更新
  • 天啊!检查我的答案,有一个非常简单的解决方案。
  • 你反对权利。我应该在打字之前考虑一下。你会收到我的 +1
【解决方案3】:

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

用户模型:

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

【讨论】:

  • 这只会给出单个广告的建议,而不是与用户相关的所有建议。
  • @nathanvda 我知道!!他通过调用“current_user.ads.propositions”来寻找建议(注意广告和建议,这表明用户有很多广告并且广告有很多建议)并且没有提到他是否想要与用户相关或与特定广告相关的所有建议
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
相关资源
最近更新 更多