2014-08-31 39 views
0

我有一个用户模型,有许多完成的任务。此外,我有用户与用户之间的订阅关系,以下等行为。我正在尝试呈现所有用户完成的任务,并完成了用户所关注用户的任务。问题是,当我将用户已完成的任务添加到用户已完成的任务数组中时,user_id列从已更改的用户标识更改为用户标识。这很奇怪,不知道是什么导致了这一点。对不起,如果我无法解释清楚。将记录添加到主动记录数组更改属性值

这里的代码:

user.rb

class User < ActiveRecord::Base 
    include BCrypt 

    before_create :generate_auth_token! 

    has_secure_password :validations => false 

    has_many :completed_tasks, dependent: :destroy 

    has_many :relationships, foreign_key: "follower_id", 
          class_name: "Relationship", 
          dependent: :destroy 
    has_many :followed_users, through: :relationships, :source => "followed" 

    has_many :reverse_relationships, foreign_key: "followed_id", 
            class_name: "Relationship", 
            dependent: :destroy 
    has_many :followers, through: :reverse_relationships 

    def generate_auth_token! 
    begin 
     self.auth_token = SecureRandom.hex 
    end while self.class.exists?(auth_token: auth_token) 
    end 
end 

completed_task.rb

class CompletedTask < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, :presence => true 
end 

completed_tasks_controller.rb在这里,在@ user.completed_tasks < < user.completed_tasks user_ID的值变为@ user.id

def index 
    if valid_auth_token? 
    @completed_tasks = @user.completed_tasks 
    @user.followed_users.each do |user| 
     @completed_tasks << user.completed_tasks 
    end 
    render file: "api/v1/completed_tasks/index.json.jbuilder", status: :ok 
    else 
    head :unauthorized 
    end 
end 
+1

这就是activerecord所做的 - some_user.completed_tasks根据定义是其user_id为some_user.id的任务集合,因此将任务添加到user.completed_tasks更改user_id – 2014-08-31 09:10:09

+0

@FrederickCheung谢谢!构建一个收集自己的和遵循用户任务的数组的正确方法是什么? – samiljin 2014-08-31 09:22:21

回答

1

你变异协会(追加对象的话),并追加对象到has_many改变外键

你可以通过调用to_a转换为数组:将对象添加到一个数组(而不是协会)将不会改变他们

你也可以做类似

@completed_tasks = @user.followed_users.inject(@user.completed_tasks) {|result, user| result + user.completed_tasks} 

这里的主要区别是,而不是使用<<(用于修改阵列)我已使用+(它返回一个包含其参数串联的新数组)

+0

谢谢!注射做了诀窍。 – samiljin 2014-08-31 10:56:37