跳到EDIT2
有:
- 项目 (has_many :group_permissions(
- 组权限 (belongs_to :p roject(
我有一个表单,您可以在其中创建一个新项目。一个项目有几个属性,如名称、状态等,现在很重要:iit。IIT 可通过单选按钮进行选择:是或否。
我想要什么:
如果有人在"项目"窗体中选择">是",则 GroupPermission 中应该有一条新记录。因此,在 iit= 1 的每个项目中,都应该有一定的 GroupMisson。
我可以在 GroupPermission 模型中进行/检查吗?就像如果
class GroupPermission < ActiveRecord::Base
if Project.where(iit: 1)
make me a record for each project
end
我甚至可以像这样在模型中制作数据库条目吗?
这是正确的方法吗?
编辑1:
在项目控制器中,我添加了:
if params[:iit] = 1
record = GroupPermission.new(cn: 'ccc-ml', project_id: params[:id])
record.save
end
然后,它会在 GroupPermissions 中添加一条新记录。但是我需要项目的 :id。如何访问即将保存的项目的 ID?
编辑2
在项目控制器中
after_filter :iit_test, :only => [:create]
...
private
def iit_test
if @trial.iit == 1
record = GroupPermission.new(cn: 'ccc-ml', project_id: @project.id, name: 'CATEGORY_3')
record.save
end
结束
编辑2工作正常。我只需要通过更新等检查它。
提前谢谢你。
该EDIT2
仅适用于访问控制器的 API,而不适用于通过 Rails 控制台添加项目、在测试中使用等。
此外,此:iit_test
将无法正确用于update action
因为您每次都会创建新的组权限。(此项目的组权限可能已存在(
您可能应该在项目模型中添加一个回调after_save
,并在那里处理添加新的 GroupPermission 。
在项目控制器中编写一个 before 操作,如下所示
def find_project
@project = Project.find_by(id: params[:id])
end
通过在操作之前调用上述方法,您将获得项目的实例。
因此,您可以通过以下方式创建组权限
def create_group_permission
@project.group_permissions.create(cn: 'ccc-ml')
end
上面将创建一个 GroupPermission 记录,其中包含在操作之前找到的项目 ID。
您可以将逻辑移动到单独的服务,而不是在projects_controller
中使用方法。这将使您的代码易于测试等。
类似的东西..
class ProjectsController < ApplicationController
def create
@project = ProjectService.create(project_params)
# rest of your controller code
end
end
#app/services
class ProjectService
def self.create(project_params)
project = Project.new(project_params)
if project.save && project.iit == 1
GroupPermission.create(cn: 'ccc-ml', project_id: project.id, name: 'CATEGORY_3')
end
project
end
end