HABTM搞砸了我 - Rails 3

时间:2011-12-11 11:44:01

标签: ruby-on-rails activerecord ruby-on-rails-3.1 has-and-belongs-to-many

我在用户和孩子之间建立了一个简单的HABM关系。

如果某个孩子属于您,我希望您看到该子项以及该子对象所属的其他用户的名称。由于某种原因,我无法打印孩子所属的其他用户的名字。

我这样选择:

@children = Child.all(:include => :users, :conditions => ["users.id = ? AND enrolled = ?", current_user.id, true])

并尝试打印:

<% for user in child.users%>
  <% if can? :manage, Child %>
    <a rel='tipsy'><%= link_to '[#{user.first_and_last_name}]', edit_child_path(child), :title => "#{user.updateChoice}"%></a>
  <%else%>  
    <a rel='tipsy'><%= link_to '[#{user.first_and_last_name}]', new_parentnote_path, :title => "#{user.updateChoice}"%></a>
  <%end%>
<%end%>

选择合适的孩子,但不打印其他用户的名字。只有当前用户的名字。

如果我选择所有孩子

Child.all
一切都按预期工作。所有的名字都打印出来,这告诉我这不是我的身份验证系统做了一些可疑的东西而是其他的东西......可能是我选择孩子的方式虽然我尝试了几种方式=(

我不确定我是否遗漏了一些非常明显的东西,但这让我困惑了好几个小时。

非常感谢任何帮助。感谢。

编辑 - 添加架构

根据要求,这里是架构。据我所知,这种关系很好。它只是让基于current_user的多个用户没有发生,如上所述。 如果我使用上面的查询,即使孩子有多个用户(我通过做一个child.count看到它),它只会打印当前用户的名字,因为它没有获取孩子所属的其他用户名同样。

  create_table "children_users", :id => false, :force => true do |t|
    t.integer "child_id"
    t.integer "user_id"
  end

然后我有了孩子。

  create_table "children", :force => true do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.boolean  "enrolled",            :default => true
    t.datetime "unenrolled_datetime"
  end

和用户

  create_table "users", :force => true do |t|
    t.string   "email"
    t.string   "encrypted_password"
    t.string   "first_name"
    t.string   "last_name"
    ........   other stuff to reset password etc
  end

2 个答案:

答案 0 :(得分:0)

我相信条件"users.id = ? ", current_user.id只会加载current_user的子项,并且当你迭代那些唯一的用户时,是当前用户。

您可能想要的是根据children.user_id选择:

@children = Child.where(user_id: current_user.id, enrolled: true).includes(:users)

答案 1 :(得分:0)

你是想让一个用户的孩子,同时,让所有其他父母?

列出用户子女并显示每个孩子的父母的简单方法是:

@children = current_user.children

<%= @children.each do |child| %>
    <h2><%= child.first_name %></h2>
    <%= @child.parents.each do |parent| %>
       <p><%= parent.first_name %></p>
    <% end %>
<% end %>

PS:

in Children model

has_many :children_users
has_many :parents, :through => :children_users, :class_name => "User", :source => :user