Rails ส่งผ่านตัวแปรไปยังวิธีการช่วยดูจากการเลือกแบบฟอร์ม

ฉันมีโค้ดเล็กน้อยในโมเดล user.rb ของฉันดังนี้:

def self.aggregate(articles)
    array = []
    articles.each do |a|
        array << {
            :id => a.nid, 
            :views => a.daily_view_metrics.sum_views(a.nid),
            :date => a.daily_view_metrics.latest_date(a.nid),
            :title => a.daily_view_metrics.latest_title(a.nid),
            :visits => a.daily_view_metrics.sum_visits(a.nid)
            }
    end
    return array
end

ใน user_controller ของฉัน ฉันส่งผ่านไปยังวิธี show @metrics = User.aggregate(@articles) (@articles เป็นเพียงส่วนย่อยของบทความสำหรับผู้ใช้นั้น)

ในมุมมองของฉัน (user#show) ฉันเรียก @metrics.each do |m| แล้วส่งออกสิ่งต่าง ๆ ทั้งหมดในตาราง ตอนนี้ตามวิดีโอนี้ ดูเหมือนว่าเมธอด link_to พร้อมพารามิเตอร์ url ดูเหมือนจะ เป็นวิธีที่ดีที่สุดในการให้ผู้ใช้สลับสิ่งที่พวกเขาต้องการจัดเรียงแบบไดนามิก

ฉันจะป้อนพารามิเตอร์ url นั้นเพื่อจัดเรียงอาร์เรย์ได้อย่างไร ฉันพยายามเรียก @metrics.sort_by{|h| h[params[:sort]]}.each do |m| โดยที่ :sort เป็นพารามิเตอร์ url จากลิงก์ของฉัน (เช่น การคลิกลิงก์ส่วนหัวของตารางมุมมองส่งผ่าน :sort => ":views" ใน โดยพื้นฐานแล้วฉันกำลังพยายามทำสิ่งนี้ sort_by{|h| h[:views]} เนื่องจากมันทำงานได้ดีสำหรับการเรียงลำดับอาร์เรย์ อย่างไรก็ตามไม่มีอะไรเกิดขึ้น อาร์เรย์ไม่ใช่ ' ไม่ได้จัดเรียง

แก้ไข:

ฉันแก้ไขมันด้วยการทำให้วิธีการรวมส่งผ่านคีย์ในรูปแบบสตริง (เช่น "id" ซึ่งตรงข้ามกับ :id) พารามิเตอร์ url ก็ทำงานได้อย่างสวยงาม

<%= link_to "Views", :sort => "views"%> ตอนนี้เรียงลำดับตามจำนวนการดูจากน้อยไปหามาก


person Killerpixler    schedule 10.03.2014    source แหล่งที่มา
comment
แน่นอน ส่งผ่านเป็นมุมมองสตริง จากนั้นคุณสามารถดำเนินการ .to_sym ได้ตลอดเวลาหากต้องการ params[:sort] # => "views" params[:sort].to_sym # => :views   -  person Rafa Paez    schedule 10.03.2014


คำตอบ (1)


หากต้องการเรียงลำดับในโหมด descending คุณสามารถปฏิเสธ - องค์ประกอบที่คุณใช้ในการเรียงลำดับได้ การสั่งซื้อภายใน ascending แล้วทำ revert กับคอลเลกชันของคุณไม่มีประสิทธิภาพ

เช่น

$> [{a: 'a1', b: 1}, {a: 'a2', b: 2}].sort_by{ |h| -h[:b] }
# => [{:a=>"a2", :b=>2}, {:a=>"a1", :b=>1}] 

$> [{a: 'a1', b: 1}, {a: 'a2', b: 2}].sort_by{ |h| h[:b] }
# => [{:a=>"a1", :b=>1}, {:a=>"a2", :b=>2}] 

ในรูปแบบมุมมองของคุณ คุณจะมีบางอย่างเช่นนี้ (เช่น RadioButton แต่อาจเป็น Select หรืออะไรก็ได้ที่คุณต้องการ):

 <%= radio_button_tag 'radio_order', 'ascending', true %> Ascending
 <%= radio_button_tag 'radio_order', 'descending' %> Descending
 <%= submit_tag "Order" %>

จากนั้นในผู้ช่วยของคุณรับค่าโดยใช้ params[:radio_order]:

aggregate('views', params[:radio_order])
person Rafa Paez    schedule 10.03.2014
comment
ฉันรู้วิธีจัดเรียง (ดังที่คุณเห็นด้านบนในโค้ดของฉัน) แต่ฉันจะนำสิ่งนี้จากฟิลด์แบบฟอร์มไปยังตัวช่วยดูได้อย่างไร - person Killerpixler; 10.03.2014
comment
ฉันแก้ไขคำถามของฉัน ดูเหมือนว่าวิธีแบบไดนามิกมากขึ้นจะใช้พารามิเตอร์ url แต่ฉันไม่สามารถทำให้มันทำงานกับคำสั่ง sort_by{} ได้ กรุณาแนะนำ - person Killerpixler; 10.03.2014