我对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>
有什么猜测会发生什么?
由于
答案 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