【发布时间】:2015-11-23 15:28:04
【问题描述】:
我有三个模型,有一个 has_many :through 关联:
class User < ActiveRecord::Base
has_many :administrations
has_many :calendars, through: :administrations
end
class Calendar < ActiveRecord::Base
has_many :administrations
has_many :users, through: :administrations
end
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
end
join Administration 模型具有以下属性:
id
user_id
calendar_id
role
这是我的Calendars#Index:
def index
@user = current_user
@calendars = Calendar.all
end
目前,这是我的日历索引视图中的内容:
<tbody>
<% @calendars.each do |calendar| %>
<tr>
<td><%= link_to calendar.name, user_calendar_path(@user.id, calendar.id) %></td>
<td><%= link_to 'Destroy', user_calendar_path(@user, calendar), method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
现在,在每个日历名称之后,仍在日历索引视图中,我想显示当前用户在此日历中的角色。
为此,我需要从administrations 连接表中获取信息,其中user_id = current_user.id(或@user.id)和calendar_id = calendar.id。
我尝试了不同的解决方案,但一直遇到NoMethodErrors 和NameErrors。
————————
更新:
以下是我尝试过的不同解决方案。
解决方案 1
在日历索引视图中添加<td><%= calendar.administration.role %></td>。
返回:
NoMethodError in Calendars#index
undefined method `administration' for #<Calendar:0x007f88fb88a050>
解决方案 2
在日历索引视图中添加<td><%= calendar.administrations.role %></td>。
返回:
NoMethodError in Calendars#index
undefined method `role' for #<ActiveRecord::Associations::CollectionProxy []>
解决方案 3
在日历索引视图中添加<td><%= calendar.role %></td>。
返回:
NoMethodError in Calendars#index
undefined method `role' for #<Calendar:0x007f88faf66a78>
————————
我怎样才能做到这一点?
【问题讨论】:
-
您能否详细说明一下日历、用户和管理之间的关系?
-
当然。在我的问题中,您已经可以找到
has_many :through关联的详细信息以及administrations表的字段,这是users表和calendars表之间的连接表。还有什么帮助?我很高兴用其他元素更新我的问题。 -
@ThibaudClement 请试试我的回答。它应该给你想要的角色:)
-
查看 Rails 4 的枚举。这是 Rails 4 中一个很棒的新工具,允许您非常轻松地分配和访问角色/状态/等。 [edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html]
-
您的解决方案 1 不起作用,因为当您有
has_many关系时它引用单数管理,因此它应该是复数,就像您在解决方案 2 中尝试的那样。但解决方案 2 不起作用因为calendar.administrations.role试图从一组管理中检索一个single 角色,所以Rails 突然出现,就像“哟,兄弟,我对此没有办法”。而您的解决方案 3 正在从不存在的日历表中寻找一个角色。
标签: ruby-on-rails ruby-on-rails-4 model-view-controller has-many-through jointable