Rails 4 has_many:through:在父模型索引视图中显示子属性

时间:2015-08-28 21:28:11

标签: ruby-on-rails ruby-on-rails-4 model-view-controller has-many-through jointable

我有三个模型,有一个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

我尝试了不同的解决方案,但一直遇到NoMethodErrorNameError 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>

--------

我该如何做到这一点?

2 个答案:

答案 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,因为您已经可以在视图中访问@usercalendar

Administration.where(user_id: @user.id, calendar_id: calendar.id).first.try(:role)