0

我在用户和孩子之间建立了一个简单的HABM关系。HABTM搞砸了 - Rails 3

如果孩子属于你,我希望你看到孩子和这个孩子对象所属的其他用户的名字。出于某种原因,我无法打印孩子所属的其他用户的姓名。

我选择这样:

@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的tiple用户不会像上面解释的那样发生。 如果我使用上面的查询,即使孩子有多个用户(我通过做一个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 
+0

的报价在你的'link_to'看起来不对 –

+0

感谢您的缓存。这是一个问题,当我拿出DIV在这里过去时,因为这个div与这个问题无关。为了清晰起见,请将div放回原处。 – Yuri

回答

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:

在儿童模式

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

罗宾,你保存了一天。谢谢。我没有用户has_many:通过,但你的例子与我目前的HABTM一起工作。我用@children = current_user.children替换'@children = Child.all(:include =>:users,:conditions => [“users.id =?AND enrolled =?”,current_user.id,true]))它只是工作。我应该想到/尝试过。奖励! – Yuri

+1

我的荣幸;)另外,这是一个细节,但'如果可以? :管理,Child'部分可以在循环之外:'can_manage_children = can? :manage,Child;'然后在循环中,执行'<%= link_to '[#{user.first_and_last_name}]', can_manage_children ? edit_child_path(child) : new_parentnote_path, :title => "#{user.updateChoice}"%>'。另外,你正在使用rails 3.1,所以你应该更新你写查询的方式:)。 – Robin

+0

我正在更新我写查询的方式,而不是.find和.all。一般来说,我仍然会遇到HABTM查询的问题。这是我第一次刺穿它。 =) – Yuri

0

我相信它是使加载只有CURRENT_USER的儿童的状况"users.id = ? ", current_user.id,随后当你遍历那些有唯一的用户,是当前用户。

你probbly要基于children.user_id选择什么:

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

感谢Clyfe的回复。但是,我没有child.user_id列。我试过你的建议,并得到(PGError:错误:列的children.user_id不存在)。 Currently in Dev。 db中只有2个孩子。两者都有多个用户。我很困惑它为什么不起作用。 – Yuri

+0

请提供您的架构的所有细节以及您正在尝试完成的内容。 – clyfe

+0

添加了我试图完成的模式和细节。感谢您的帮助Clyfe。 – Yuri