我正试图解决这个问题,但似乎无法解决。所以我有一个Rails应用程序,它有project
模型和client
模型。客户端has_many
项目和客户端belongs_to
项目。我创建了一个迁移来连接两个表,如下所示:
class AddClientsProjectsTable < ActiveRecord::Migration
def up
create_table :clients_projects do |t|
t.integer :client_id
t.integer :project_id
end
end
def down
drop_table :clients_projects
end
end
我所要做的就是在项目循环中的项目INDEX视图中显示项目属于哪个客户端。我可以通过项目控制器的SHOW方法中的<% @project.clients.each do |client|%><%= client.name %><% end%>
和@project = Project.find(params[:id])
在项目的SHOW页面上轻松地做到这一点。
但是,将这样的实例变量添加到index方法中,然后尝试在<% @projects.each do |project| %>
循环中调用它是行不通的!
我至少知道数据保存正确,因为我可以在显示页面上显示项目的客户端名称,但我就是无法将其显示在索引视图上。
如果有帮助的话,这就是我将项目分配给客户的方式(通过项目索引页面完成):
<%= form_for @project, :html => { :multipart => true } do |f| %>
<% for client in Client.find(:all) %>
<%= check_box_tag "project[client_ids][]", client.id, @project.clients.include?(client) %>
<label><%= client.name %></label>
<% end %>
<%= f.submit %>
<% end %>
最后,这是我在循环中的项目索引页面上玩过的代码,用来显示每个项目被分配给哪个客户端:
<% Client.all do |client| %><%= client.name %><% end %>
它不起作用!
如果我没有错,这就是你想要实现的目标???
@projects = Project.all
@projects.each do |project| #looping on all projects
project.clients.each do |client| #looping on clients for a project
client.name
end
end
I是一个属于客户端的项目,您只需要在项目表上添加client_id
。不需要联接表:)您可以通过client.projects访问客户端的项目列表,而不需要做任何花哨的事情。另一方面,如果一个项目可以由不同的客户端共享,那么您拥有正确的表结构,但需要更改关联。