如何根据另一个数组中的值为数组中的每个ActiveRecord添加新属性?

时间:2016-03-02 04:42:55

标签: ruby-on-rails arrays join activerecord

在帮助方面,你始终是不可替代的。我遇到了一个新问题。

我有两个模特。

User(id: integer)
Follower(id: integer, source_user_id: integer, target_user_id: integer)

我通过get获得params[:user_id]输入。

我需要创建一个包含is_following => true/false的记录数组。

is_following

有跟随者记录时,

source_user_id = params[:user_id]应该为真 如果此参数没有跟随者记录,则

is_following应为false

最有效的方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

用户模型中添加方法的快速答案:

class User < ActiveRecord::Base
   has_many :followers, foreign_key: :source_user_id

   def is_following? follower_id
     follower_ids.include? follower_id.to_i
   end
end

然后:

user.is_following? params[:user_id]

根据您的问题假设关联。 请注意,这是对您的问题的简短回答。您可能希望重新设计关联,将方法移动到Decorator(取决于您的用例)并优化查询。

答案 1 :(得分:1)

编辑以反映对您想要的内容的澄清。

User模型中定义一个名为is_following:

的辅助函数
def is_following?
  !Follower.where(source_user_id: self.id).empty?
end

现在,您可以使用map方法创建数组。你必须有一个哈希数组,因为用户没有任何类型的属性来存储布尔值:

User.all.map { |user| {user: user, is_following: user.is_following? } }

答案 2 :(得分:-1)

用户模型修改

has_many :followers, class_name: 'Follower', foreign_key: :target_user_id

def is_followed? follower_id
    followers.where(:source_user_id => follower_id).exists?
end

和API

users = users.map {|user| { user: user, is_following: user.is_followed?(params[:user_id]) } }