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 中的紧迫问题是:
我认为我的问题出在底层关联或数据上 - 给定 rails 控制台无法 return 任何记录,是这种情况吗?
我想我应该使用 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 为 1
、2
、3
、4
、5
、6
的列表 - lists
table 仅以 id
开头 7
:
id |
----+
7 |
8 |
9 |
10 |
11 |
12 |
您的 has_many :through
关联看起来可以很好地工作,只是您没有与之匹配的数据。
如果您想测试您的关系是否正常,您可以使用 @codeurge
的建议创建一个列表。
我正在尝试通过 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 中的紧迫问题是:
我认为我的问题出在底层关联或数据上 - 给定 rails 控制台无法 return 任何记录,是这种情况吗?
我想我应该使用 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 为 1
、2
、3
、4
、5
、6
的列表 - lists
table 仅以 id
开头 7
:
id |
----+
7 |
8 |
9 |
10 |
11 |
12 |
您的 has_many :through
关联看起来可以很好地工作,只是您没有与之匹配的数据。
如果您想测试您的关系是否正常,您可以使用 @codeurge
的建议创建一个列表。