我有三个模型,有一个has_many:通过关联:
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
加入管理模型具有以下属性:
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
。
我尝试了不同的解决方案,但一直遇到NoMethodError
和NameError
s。
--------
更新
以下是我尝试的不同解决方案。
解决方案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>
--------
我该如何做到这一点?
答案 0 :(得分:2)
日历有许多管理,每个用户一个。您需要找到与您的特定用户关联的那个。找到可以这样做
False
要么
astype(float)
现在,这些返回一个列表,而不是单个项目,所以你想要抓住第一个:
calendar.administrations.where(user_id: @user.id)
您现在拥有给定用户的第一个Administration对象。然后你可以要求这个角色。
尝试此解决方案。
calendar.administrations.select{|administration| administration.user_id = @user.id}
答案 1 :(得分:1)
您可以直接从您的视图中获取role
模型中的Administration
,因为您已经可以在视图中访问@user
和calendar
:
Administration.where(user_id: @user.id, calendar_id: calendar.id).first.try(:role)