Ruby on Rails - max_by模型数据中的未定义方法

时间:2016-09-18 16:28:23

标签: ruby-on-rails

我试图在Stack上找到类似但没有运气的东西。

我希望得到max_by的相关性,只得到1个结果。 我将值存储在tmp变量中,并且跟踪积压返回:

 #<Object:0x007f89e852e1e8>
 #<Object:0x007f89e852e030>
 #<Object:0x007f89e852d6f8>
 #<Object:0x007f89e852d400>
 #<Object:0x007f89e852d018>
 #<Object:0x007f89e852cde8>
 #<Object:0x007f89e852cb68> 

所以,我在tmp变量中返回了7个对象,但是当我尝试执行max_by时:

def update
  if params[:user_id].blank? 
    render json: "No user", status: 500
  else
    user = User.find_by_id(params[:user_id])
    tmp = user.family.map(&:objects)
    object1=tmp.max_by(&:relevance)
    @hierarchy.update_column("top_hierarchy", object1.keyword)
    render json: @hierarchy, status: 200
  end
end

如上所述,我还尝试隔离循环中的每个对象(并得到相同的错误):

tmp.each do |my_object|
  puts my_object.relevance
end

和tracelog:

NoMethodError (undefined method `relevance' for #<Object::ActiveRecord_Associations_CollectionProxy:0x007f89ed968ab0>): 

以下是有关模型的一些信息

Object是一个独立的模型,使用以下属性定义。 Family属于用户,拥有family_objects,这是一个包含ObjectFamily的映射表。

模特:

#FamilyObject attributes
FamilyObject(id: integer, family_id: 204, object_id: 303: integer)

#Family model
belongs_to :user
has_many :family_objects, class_name: 'Family::FamilyObject', dependent: :destroy
has_many :objects, through: :family_objects    
#Object attributes
Object(id: integer, relevance: integer, keyword: string, created_at: datetime, updated_at: datetime, verified: boolean)

#Object Model
has_many :family_objects, class_name: 'Family::FamilyObject', dependent: :destroy
has_many :families, through: :family_objects

这可能很明显,但我不能说#39;搞清楚!

2 个答案:

答案 0 :(得分:0)

您正在集合而不是单个对象上调用.relevance。是否有可能有2个具有相同相关性的对象,因此它返回的是集合而不是单个对象?

答案 1 :(得分:0)

根据APIDock的说法,

  

Active Record中的关联代理是对象之间的中间人   持有该关联,称为@owner,以及实际   关联对象,称为@target。任何一种关联   代理是关于在@reflection中可用的。这是一个例子   class ActiveRecord :: Reflection :: AssociationReflection。

所以你正在做的是在关联对象上调用relevance方法,而不是对象本身。

你可以尝试

object1 = tmp.max_by { |obj| obj.relevance }

这应该在每个对象上调用relevance方法。

如果有效,请告诉我。