我正在尝试通过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中的问题是:
我认为我的问题出现在底层关联或数据中 - 如果rails控制台无法返回任何记录,是这种情况吗?
我想我应该使用用户控制器/视图来显示数据 - 这是最合适的地方,还是我应该使用另一个控制器/视图?...还考虑到我正在考虑实施一个管理界面,包括主用户列表维护。
提前谢谢! LL
答案 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 1
,2
,3
,4
,5
,6
- {的列表{1}}表仅以lists
id
开头:
7
您的 id |
----+
7 |
8 |
9 |
10 |
11 |
12 |
关联看起来效果非常好,只是您没有匹配的数据。
如果您想测试您的关系是否正常运行,可以使用has_many :through
的建议来创建列表。