使用rails通过子视图访问父级

时间:2014-04-05 16:18:53

标签: ruby-on-rails ruby-on-rails-4

我有一个带有儿童主题的模型字段。主题是帖子,我想显示哪些主题是子项的字段(例如,如果帖子有主题' rofl',' lol' lmao&#39 ;所有这些主题都属于父母的互联网缩写')。

我想要显示如下内容:

INTERNET ABBREVIATION rofl lol lmao

以下是视图中的代码。

  <div class="fields">
  <% reading.topics.each do |topic| %>
    <span class="indivfields">
    <%= link_to topic.field.name, field_path(topic.field) %>
    </span>

  </div>

  <div class="subjects">
    <% reading.topics.each do |topic| %>
    <span class="indivsubjects"> <%= link_to topic.name,field_topic_path(topic.field,topic) %></span>
    <% end %>
  </div>

  <% end %>

问题是因为第一个reading.topic.each do是主题而不是字段所以,继续上面的示例,我最终得到的输出是:

INTERNET ABBREVIATION rofl lol lmao

INTERNET ABBREVIATION rofl lol lmao

INTERNET ABBREVIATION rofl lol lmao

根据孩子的数量进行打印,我想要显示一次。谢谢!

2 个答案:

答案 0 :(得分:0)

阅读has_many字段has_many主题似乎。我会像这样构建模型:

class Reading
  has_many :fields
  has_many :topics
end

class Field
  belongs_to :reading
  has_many :topics
end

class Topic
  belongs_to :reading
  belongs_to :field
end

这样你就可以reading.fields.each

<%= reading.fields.each do |field| %>
  <h1><%= field %>
  <%= field.topics.each do |topic| %>
    <p><%= topic %></p>

为什么呢?因为您希望让软件尽可能地映射域模型(或现实世界中的内容)。即使从局外人的角度来看,一个帖子可以选择按字段和主题进行分类,这看起来很直观。

对于我们的应用程序,我们做同样的事情。我们有问题,主题和主题,主题属于主题。与我上面的数据库模式相同(只是不同的名称)。

然而,如果这没有意义(呵呵),解决这个问题的其他方法是group将模型从Topic提升到Field。涉及SQL(检查出来:http://guides.rubyonrails.org/active_record_querying.html#group),并通过哈希(Group Hash by values in ruby)进行分组。对不起,如果我没有尽那么有帮助,我现在有点累了。

顺便提一下,我建议不要像indiv那样做随机缩写。我知道这是你最好的意图,将individual缩写为indiv听起来很直观,但这只是最好的编码练习,没有随机缩写,也许其他人会加入你的编码,他们可能会考虑indiv是什么。 (我没有清洁代码的文章,但请查看:http://agileinaflash.blogspot.com/2009/07/abbreviations.html

答案 1 :(得分:0)

所以我有一个答案给大家。我的一个课程仍然使用'indiv'缩写名称,所以请原谅我。我需要使用group_by方法。这是代码:

  <% reading.topics.group_by(&:field).each do |fields, topics| %>
    <%= link_to fields.name, field_path(fields), class: "individualfields" %>


    <div class="subjects">
    <%= topics.collect { |t| link_to t.name, field_topic_path(fields, t), class: "indivsubjects"  }.join.html_safe  %>
    </div>
  <% end %>

就是这样。感谢获得这个答案必须在Rails IRC频道上找到各种各样的人。它的效果非常好,因为这段代码实际上比我之前的代码仅用于渲染主题,这会渲染字段和主题。