我有一个带有儿童主题的模型字段。主题是帖子,我想显示哪些主题是子项的字段(例如,如果帖子有主题' 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
根据孩子的数量进行打印,我想要显示一次。谢谢!
答案 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频道上找到各种各样的人。它的效果非常好,因为这段代码实际上比我之前的代码仅用于渲染主题,这会渲染字段和主题。