【问题标题】:Rails 4 has_many :through : display child attribute in parent model index viewRails 4 has_many :through : 在父模型索引视图中显示子属性
【发布时间】: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

在日历索引视图中添加&lt;td&gt;&lt;%= calendar.administration.role %&gt;&lt;/td&gt;

返回:

NoMethodError in Calendars#index
undefined method `administration' for #<Calendar:0x007f88fb88a050>

解决方案 2

在日历索引视图中添加&lt;td&gt;&lt;%= calendar.administrations.role %&gt;&lt;/td&gt;

返回:

NoMethodError in Calendars#index
undefined method `role' for #<ActiveRecord::Associations::CollectionProxy []>

解决方案 3

在日历索引视图中添加&lt;td&gt;&lt;%= calendar.role %&gt;&lt;/td&gt;

返回:

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


【解决方案1】:

您可以像这样直接从您的视图中从Administration 模型中获取role,因为您已经可以在您的视图中访问@usercalendar

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

【讨论】:

  • 感谢您的响应。您建议的代码返回以下错误:NoMethodError in Calendars#index undefined method role' for nil:NilClass`。我应该添加一些验证还是问题来自其他地方?
【解决方案2】:

一个日历有许多管理,每个用户一个。您需要找到与您的特定用户相关联的那个。发现可以这样完成 calendar.administrations.where(user_id: @user.id) 要么 calendar.administrations.select{|administration| administration.user_id = @user.id}

现在,这些返回一个列表,而不是单个项目,因此您需要获取第一个: calendar.administrations.where(user_id: @user.id).first 您现在拥有给定用户的第一个管理对象。然后你就可以申请这个角色了。

试试这个作为解决方案。 <%= calendar.administrations.where(user_id: @user.id).first.role %>

【讨论】:

  • 是的,这个解决方案也有效;)非常感谢。
猜你喜欢
  • 2016-02-15
  • 2011-03-06
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多