Rails 4 个协会

Associations in Rails 4

我正在 rails 上使用 ruby 开发用于任务管理的 Web 应用程序。 我有两个模型 usertask。模型看起来像这样

class User < ActiveRecord::Base
  has_many :tasks
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  def role?(role_name)
    role == role_name
  end

  def self.assigned_user(task_params)
    User.where("name = ?", task_params["assigned_to"])
  end
end



class Task < ActiveRecord::Base
  belongs_to :user
end

我想要的是在创建任务时将任务分配给用户。但是我不知道如何在 tasks_controllercreate 操作中做到这一点。我的创建操作如下所示

def create
    @task = Task.new(task_params)
    respond_to do |format|
      if @task.save
        @user = User.assigned_user(task_params)
        @user.tasks << Task.last
        format.html { redirect_to @task, notice: 'Task was successfully created.' }
        format.json { render :show, status: :created, location: @task }
      else
        format.html { render :new }
        format.json { render json: @task.errors, status: :unprocessable_entity }
      end
    end
  end

每当管理员在创建任务时分配任务,它都会给出一个错误 undefined method tasks for #<User::ActiveRecord_Relation:0x007fe7b1c60610>。有没有人可以帮助解决这个问题?

它给你的错误是因为 where 方法正在返回一组用户,而你只需要一个用户:

def self.assigned_user(task_params)
  User.where("name = ?", task_params["assigned_to"]).first
end

您可能想修改您的代码,因为我猜如果 name 不是唯一的,您可能会遇到问题。确保您用于检索用户的字段是唯一的。

创建代码如下所示:

def create
  @task = Task.new(task_params)
  respond_to do |format|
    if @task.save
      @user = User.assigned_user(task_params)
      @user.tasks << @task
      format.html { redirect_to @task, notice: 'Task was successfully created.' }
      format.json { render :show, status: :created, location: @task }
    else
      format.html { render :new }
      format.json { render json: @task.errors, status: :unprocessable_entity }
    end
  end
end

嗯,错误,不言而喻:

undefined method tasks for User::ActiveRecord_Relation:0x007fe7b1c60610>

def self.assigned_user(task_params)
    User.where("name = ?", task_params["assigned_to"])
end

where 方法 returns 一个 array(ActiveRecord_Relation), 那么因为你只需要获取一个对象,应该是:

User.where(name: task_params["assigned_to"]).first

甚至更好:

User.find_by(name: task_params["assigned_to"])

还有这一行:

@user.tasks << Task.last

会在数据库中进行不必要的查询。

所以应该改为:

@user.tasks << @task

希望对您有所帮助!!