访问多对多中的属性

时间:2011-01-17 01:15:29

标签: ruby-on-rails

我有一个rails应用程序,我希望能够做类似的事情 task.labels.first.label_name获取任务的标签名称。但是,我得到undefined method label_name。我在控制台中做了t = Task.first; t.labels.first.label_name,这样就可以了,所以我不知道发生了什么。这是模型,然后是错误的位置:

class Categorization < ActiveRecord::Base
 belongs_to :label
 belongs_to :task
end

class Label < ActiveRecord::Base
  attr_accessible :label_name

  has_many :categorizations
  has_many :tasks, :through => :categorizations
end

class Task < ActiveRecord::Base
  attr_accessible :task

  has_many :categorizations
  has_many :labels, :through => :categorizations
end

错误在索引

<% for task in @tasks %>
<tr>
  <td><%= task.task %></td>
  <td><%= task.labels.first.label_name %></td>
  <td><%= link_to "Show", task %></td>
  <td><%= link_to "Edit", edit_task_path(task) %></td>
  <td><%= link_to "Destroy", task, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>

1 个答案:

答案 0 :(得分:1)

我的猜测是@tasks中的任务之一没有任何标签所以当你调用task.labels.first它返回nil然后你尝试调用label_name为nil当然不起作用。

最简单的解决方案是做这样的检查:

<td><%= task.labels.first.label_name unless task.labels.first.nil? %></td>

现在在视图中看起来不那么好,所以你可能想把这个检查放在你的Task模型中,或许像这样:

class Task < ActiveRecord::Base
  attr_accessible :task

  has_many :categorizations
  has_many :labels, :through => :categorizations

  def label_name
    self.labels.first.label_name unless self.labels.first.nil?
  end
end

在视图中:

<td><%= task.label_name %></td>

另外,如果您想查看所有相关标签,您可以这样做:

task.labels.map(&:label_name).join(", ")