2017-04-12 52 views
0

我有一个属于支付模型的用户模型。因此,创建用户时,其(年)属性用于查询Pay模型并返回包含费率的对象。一切正常,如果我通过查询:RAILS || ActiveRecord :: AssociationTypeMismatch:新模型对象上的错误

class User < ApplicationRecord 
    belongs_to :pay 
end 

* CONTROLLER ACTIONS * 
@user = User.new(user_params) 
@user.pay = Pay.find(1) 
=> #< Pay object returned with attributes....> 

但下面返回的ActiveRecord :: AssociationTypeMismatch:......这是

@user = User.new(user_params) 
@user.pay = Pay.where("years = ?", @user.years) #FAILS 

也尝试过收费:: ActiveRecord_Relation的实例下面....

@user.pay = Pay.where(years: @user.years) 
@user.pay = Pay.where(years: params[:years] 

即使输入查询字符串....

@user.pay = Pay.where(years: "3") 

所以查询返回的是ActiveRecord_Relation的实例而不是AssociationType?

回答

2

where总是返回ActiveRecord关系,find返回单个实例。您可以使用where像这样类似的效果

@user.pay = Pay.where(years: @user.years).first 

但更好的方法是

@user.pay = Pay.find_by(years: @user.years) 
+1

谢谢冰人。我试图追加.limit(1),但仍然失败,所以我感到非常紧张。你的解决方案可以工作,并且我学习了更多关于ActiveRecord的知识。队友的欢呼声! – DawgOnKing

+0

很高兴工作,祝你好运。 – Iceman

+2

FWIW'.limit(1)'仍然返回一个_one_ ActiveRecord关系,它可以被认为是一个不是ActiveRecord的数组。 – whodini9