我正在使用rails创建一个用于学习目的的小型项目管理应用程序。我有一个通过设计的用户模型设置。用户可以拥有许多客户端。然后每个客户将有一个到多个项目/活动。我的问题是如何将客户端ID传递给表单中的项目/活动,或者是否有“轨道”来执行此操作?
我的项目表格如下。我在想像隐藏字段会做的事情,但我如何找到客户端ID。
<%= form_for(@project) do |f| %>
<% if @project.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@project.errors.count, "error") %> prohibited this project from being saved:</h2>
<ul>
<% @project.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :description %><br />
<%= f.text_area :description %>
</div>
<div class="field">
<%= f.hidden_field :client_id, :value => @client.id %>
</div>
<div class="actions">
<%= f.submit %>
</div>
答案 0 :(得分:1)
我会像这样设置你的系统:
#app/models/user.rb
Class User < ActiveRecord::Base
has_many :clients
end
#app/models/client.rb
Class Client < ActiveRecord::Base
belongs_to :user
has_many :projects
end
#app/models/project.rb
Class Project < ActiveRecord::Base
belongs_to :client
end
您的架构如下:
users
id | email | etc | etc
clients
id | user_id | name | email | etc | etc
projects
id | client_id | name | etc | etc
<强>表格强>
要基于客户端保存新项目(如果每个项目只能有一个客户端),则使用nested resources:
#config/routes.rb
resources :clients do
resources :projects
end
这将创建此路由结构:
http://your-app.com/clients/15/projects/new
这意味着您将拥有变量params[:client_id]
(通过路线)。然后我会使用强参数来合并控制器上的参数:
#app/controllers/projects_controller.rb
private
def params
params.require(:project).permit(:title, :etc, :etc).merge(client_id: params[:client_id])
end
将客户端添加到项目
要将clients
添加到project
,您必须处理has_many :through
关联,如下所示:
#app/models/project.rb
Class Project < ActiveRecord::Base
has_many :client_projects
has_many :clients, through: :client_projects
end
#app/models/client_project.rb
Class ClientProject < ActiveRecord::Base
belongs_to :client
belongs_to :project
end
#app/models/client.rb
Class Client < ActiveRecord::Base
has_many :client_projects
has_many :projects, through: :client_projects
end
这使用join model
(client_projects
),如下所示:
client_projects
id | client_id | project_id | created_at | updated_at
这将创建一个单独的表,您可以将clients
分配给任何您想要的项目。如果您希望每个项目有多个客户端,那么这只是必要的,而前一个想法是每个客户端有一个项目
答案 1 :(得分:0)
如果是Client
has_many :projects
,那么Project
:belongs_to :client
。
然后你可以简单地做
@project.client_id
编辑:哦等等,我好像被误解了。此时项目不属于客户端了吗?您想将客户端分配给项目吗?