Rails has_many通过不返回记录

时间:2016-01-16 21:50:43

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

我正在尝试通过Rails 4.2中的关联设置和使用我的第一个has_many。

我已经使用数据填充了表格,并且可以在三个表格中查看相关数据,但我无法理解我的问题是模型,关联还是表格数据。

模型是:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  has_many :user_lists
  has_many :lists, through: :user_lists

  accepts_nested_attributes_for :user_lists  
end

class List < ActiveRecord::Base
  has_many :user_lists
  has_many :users, through: :user_lists
end


class UserList < ActiveRecord::Base
  belongs_to :user
  belongs_to :list

  validates_presence_of :user
  validates_presence_of :list
end

样本表数据:

 users (just showing id and email for particular test user):

 id |       email
----+-------------------
  3 | antman@marvel.com


user_lists:

 id | user_id | list_id 
----+---------+---------
 13 |       1 |       1 
 14 |       2 |       2 
 15 |       2 |       3 
 16 |       3 |       4 
 17 |       3 |       5 
 18 |       3 |       6 


lists:

 id | list_item_id |       list_name        | due_date
----+--------------+------------------------+----------
  7 |              | 1: Coles               |          
  8 |              | 2: Monday way home     |          
  9 |              | 2: Woolworths Sandgate |          
 10 |              | 3: IGA way home        |          
 11 |              | 3: Aldi way home       |          
 12 |              | 3: Pool stuff          |          

用户控制器:

def index
  @user = current_user
end

用户查看:

<table>
  <thead>
    <tr>
      <th>List</th>
      <th></th>
      <th></th>
    </tr>
  </thead>

  <tbody>
    <% @user.lists.each do |list| %>
      <tr>
        <td><%= list.list_name %></td>
        <td><%= link_to 'Show', user_list %></td>
        <td><%= link_to 'Edit', edit_user_list_path(user_list) %></td>
        <td><%= link_to 'Destroy', user_list, method: :delete, data: { `confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

我之前设置了一个user_lists控制器并根据当前登录的用户成功查看了相关的user_lists记录(连接表)。

当尝试在Rails控制台中测试“任何”列表时,以及相关用户的所有列表(在这种情况下为#3),我得到的是假的,没有:

irb(main):001:0> user=User.last
  User Load (3.0ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id"         DESC LIMIT 1
=> #<User id: 3, first_name: nil, last_name: nil, username: nil, email:     "antman@marvel.com",...
irb(main):002:0> user.lists.any?
  List Exists (0.8ms)  SELECT  1 AS one FROM "lists" INNER JOIN "user_lists" ON "lists"."id" = "user_lists"."list_id" WHERE "user_lists"."user_id" = $1 LIMIT 1  [["user_id", 3]]
=> false
irb(main):003:0> user.lists.all
  List Load (0.6ms)  SELECT "lists".* FROM "lists" INNER JOIN "user_lists" ON "lists"."id" = "user_lists"."list_id" WHERE "user_lists"."user_id" = $1  [["user_id", 3]]
=> #<ActiveRecord::AssociationRelation []>
irb(main):004:0>

我在HMT 101中的问题是:

  1. 我认为我的问题出现在底层关联或数据中 - 如果rails控制台无法返回任何记录,是这种情况吗?

  2. 我想我应该使用用户控制器/视图来显示数据 - 这是最合适的地方,还是我应该使用另一个控制器/视图?...还考虑到我正在考虑实施一个管理界面,包括主用户列表维护。

  3. 提前谢谢! LL

2 个答案:

答案 0 :(得分:1)

在提供的示例数据中,似乎缺少列表4,5和6的ID。如果确实如此,则连接表指的是不再存在且不会在控制台中显示的记录。

要获得进一步的帮助,您是否可以尝试创建新列表,并在保存记录后向我们提供user.lists的输出。

例如:

user = User.last
list = user.lists.create!({
    list_name: "4: Test List"
})
user.lists

如果所有关联都正常工作,这将允许您查看创建的列表。如果没有,您可以查看list以查看出现了什么问题 - 无论是联接表记录还是其他记录。

答案 1 :(得分:0)

您没有任何包含ID 123456 - {的列表{1}}表仅以lists id开头:

7

您的 id | ----+ 7 | 8 | 9 | 10 | 11 | 12 | 关联看起来效果非常好,只是您没有匹配的数据。

如果您想测试您的关系是否正常运行,可以使用has_many :through的建议来创建列表。