has_many关联表令人困惑

时间:2011-10-14 20:26:22

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 has-many has-many-through

我的目标是打印指定城市和类别的用户名单及其姓名,地址和俱乐部名称。名称和地址显示正确,但当我添加俱乐部名称时,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

2 个答案:

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

你的路线很好。