我的目标是打印指定城市和类别的用户名单及其姓名,地址和俱乐部名称。名称和地址显示正确,但当我添加俱乐部名称时,undefined method memberships for #<Enumerator:0xa5509b0>
说。我知道这是因为俱乐部是不同的模型,所以问题是我如何访问俱乐部名称?我在复杂的has_many realtionship中真的很浅。可以请任何人进行必要的更正,这是我得到了多远。谢谢你提前
模型
class User < ActiveRecord::Base
has_many :memberships
has_many : clubs,:through =>:memberships
belongs_to :category
belongs_to :city
end
class Club < ActiveRecord::Base
has_many :users
has_many :memberships
has_many : users ,:through =>:memberships
belongs_to :city
end
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :club
end
class City < ActiveRecord::Base
has_many :clubs
has_many :users
end
class Category < ActiveRecord::Base
has_many :users
end
CONTROLLER
@users=User.where("category_id =? AND city_id=?",Category.find(2),session[:city_id])
@user=@users.collect
@club=@user.memberships #this gives undefined method membership
查看
<% @user.each do |user| %>
<%= user.username %>
<%= user.address %>
<%= @club.name %> #attribute name is in the club model not membership
<%end%>
ROUTE
devise_for :users
resources :city,:club,:category
答案 0 :(得分:1)
下面的行返回一个数组而不是你期望的数组,即User object。
@user=@users.collect
如果视图中显示的用户属于不同的俱乐部,您应该直接在视图中访问它们。如果需要,你可以急切加载俱乐部。
在您的控制器中
@users=User.where(:category_id => Category.find(2), :city_id=>session[:city_id]).
include(:clubs)
在您的视图中
<% @users.each do |user| %>
<%= user.username %>
<%= user.address %>
<% user.clubs.each do |club| %>
<%= club.name %>
<%end%>
<%end%>
答案 1 :(得分:0)
首先,您在Club课程中遇到错误。你不能有2个同名的关系。第二个将首先覆盖。
has_many : users ,:through =>:memberships
应该是
has_many :members, :through =>:memberships, :foreign_key => 'user_id'
搜索应该是:
@users = User.where(:category_id => 2, :city_id => 3).include(:clubs)
或者您要搜索的任何值。视图是:
<% @user.each do |user| %>
<%= user.username %>
<%= user.address %>
<%= user.club.name %> #attribute name is in the club model not membership
<%end%>
你的路线很好。