Rails 4 个协会
Associations in Rails 4
我正在 rails 上使用 ruby 开发用于任务管理的 Web 应用程序。
我有两个模型 user
和 task
。模型看起来像这样
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_controller
的 create
操作中做到这一点。我的创建操作如下所示
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
希望对您有所帮助!!
我正在 rails 上使用 ruby 开发用于任务管理的 Web 应用程序。
我有两个模型 user
和 task
。模型看起来像这样
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_controller
的 create
操作中做到这一点。我的创建操作如下所示
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
希望对您有所帮助!!