如何在rails中创建模型之间的关系

时间:2013-12-28 10:34:55

标签: ruby-on-rails ruby ruby-on-rails-3

我正在使用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>

2 个答案:

答案 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 modelclient_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

请参阅Rails Association Basics

编辑:哦等等,我好像被误解了。此时项目不属于客户端了吗?您想将客户端分配给项目吗?