【问题标题】:Rails 'returning' method - One-liner to build Array from Multiple Arrays in Ruby?Rails 'returning' 方法 - 从 Ruby 中的多个数组构建数组的单线?
【发布时间】:2010-02-07 09:27:38
【问题描述】:
如何在 ruby 中将以下内容转换为清晰的单行?
def questions
results = []
sections.each do |section|
results = results.concat(Question.find_all_by_survey_section_id(section.id))
end
results
end
我觉得我可以在其中使用&: (Symbol#to_proc) 和returning 方法。
【问题讨论】:
标签:
ruby-on-rails
ruby
arrays
【解决方案1】:
假设 SurveySection has_many :questions,您可以将其简化为:
sections.map(&:questions).flatten
或者,如果方法是在 ActiveRecord 模型中定义的,您可以将其声明为 has_many :questions, :through => :sections,而您根本不必定义该方法。
【解决方案2】:
def questions
sections.map do |section|
Question.find_all_by_survey_section_id(section.id)
end.flatten
end
或
def questions
sections.inject([]) do |all, section|
all.concat Question.find_all_by_survey_section_id(section.id)
end
end
【解决方案3】:
你可以使用地图或收集,像这样
def questions
sections.map{|section| Question.find_all_by_survey_section_id(section.id)}.flatten
end
但是,我认为您不能使用符号来执行此操作,因为您不只是调用集合上的方法。
【解决方案4】:
看不到任何障碍:
def questions
sections.map(&:id).flat_map(&Question.method(:find_all_by_survey_section_id))
end