Rails has_many 通过不返回记录

Rails has_many through not returning records

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

我已经在 table 中填充了数据,并且可以看到三个 table 中的关联数据,但我无法理解我的问题是与模型、关联还是 table数据。

模型是:

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

示例 table 数据:

 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 记录(加入 table)。

当尝试在 Rails 控制台中测试 "any" 列表时,以及类似地测试来自关联用户的所有列表(在本例中为#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" =  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" =   [["user_id", 3]]
=> #<ActiveRecord::AssociationRelation []>
irb(main):004:0>

我在 HMT 101 中的紧迫问题是:

  1. 我认为我的问题出在底层关联或数据上 - 给定 rails 控制台无法 return 任何记录,是这种情况吗?

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

提前谢谢你! LL

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

如需进一步帮助,您能否尝试创建一个新列表,并在保存记录后向我们提供 user.lists 的输出。

例如:

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

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

您没有任何 ID 为 123456 的列表 - lists table 仅以 id 开头 7:

 id |
----+
  7 |
  8 |  
  9 |
 10 |       
 11 |
 12 |

您的 has_many :through 关联看起来可以很好地工作,只是您没有与之匹配的数据。

如果您想测试您的关系是否正常,您可以使用 @codeurge 的建议创建一个列表。