2009-11-18 4 views
6

मैं रेल के लिए नया हूं इसलिए यहां कुछ मदद का उपयोग कर सकते हैं। मैंने टिप्पणियों के साथ ब्लॉग बनाने और यहां तक ​​कि कुछ AJAX घंटी और सीटी बनाने के लिए कई ट्यूटोरियल का पालन किया है और मैं कुछ ऐसी चीज पर फंस गया हूं जो मुझे आशा है कि आसान है। ब्लॉग और टिप्पणियों दोनों के लिए डिफ़ॉल्ट प्रदर्शन सबसे पुराना सबसे पहले सूचीबद्ध करना है। मैं सबसे हालिया प्रविष्टियों और शीर्ष पर सबसे हाल की टिप्पणियां दिखाने के लिए इसे कैसे उलटा कर सकता हूं। वास्तव में यह नहीं पता कि यह नियंत्रक या मॉडल का एक कार्य है या नहीं। मैंने कुछ अनुकूलन किया है, इसलिए यह नियंत्रक के लिए कोड है। आरबी फाइलें अगर यह मदद करता है।ब्लॉग प्रविष्टियों और टिप्पणियों के प्रदर्शन के विपरीत क्रम, रेल पर रूबी

टिप्पणियाँ नियंत्रक

class CommentsController < ApplicationController 
    def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.create!(params[:comment]) 

    respond_to do |format| 
     format.html { redirect_to @post} 
     format.js 
    end 
    end 
end 

पोस्ट नियंत्रक

class PostsController < ApplicationController 
    before_filter :authenticate, :except => [:index, :show] 

    # GET /posts 
    # GET /posts.xml 
    def index 
    @posts = Post.all(:include => :comments) 


    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
     format.json { render :json => @posts } 
     format.atom 
    end 
    end 

    # GET /posts/1 
    # GET /posts/1.xml 
    def show 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 

    # GET /posts/new 
    # GET /posts/new.xml 
    def new 
    @post = Post.new 

    respond_to do |format| 
     format.html { redirect_to @post} 
     format.js 
    end 
    end 

    # GET /posts/1/edit 
    def edit 
    @post = Post.find(params[:id]) 
    end 

    # POST /posts 
    # POST /posts.xml 
    def create 
    @post = Post.new(params[:post]) 

    respond_to do |format| 
     if @post.save 
     flash[:notice] = 'Post was successfully created.' 
     format.html { redirect_to(@post) } 
     format.xml { render :xml => @post, :status => :created, :location => @post } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /posts/1 
    # PUT /posts/1.xml 
    def update 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     if @post.update_attributes(params[:post]) 
     flash[:notice] = 'Post was successfully updated.' 
     format.html { redirect_to(@post) } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /posts/1 
    # DELETE /posts/1.xml 
    def destroy 
    @post = Post.find(params[:id]) 
    @post.destroy 

    respond_to do |format| 
     format.html { redirect_to(posts_url) } 
     format.xml { head :ok } 
    end 
    end 

    private 

    def authenticate 
    authenticate_or_request_with_http_basic do |name, password| 
     name == "admin" && password == "secret" 
    end 
    end 
end 

उत्तर

19

रूप jtbandes ने बताया सूचकांक में पदों को उल्टा करने के आप पढ़ने के लिए अपनी अनुक्रमणिका कार्रवाई में लाइन को बदल देंगे:

@posts = Post.all(:include => :comments, :order => "created_at DESC") 

आदेश में अपनी टिप्पणी की लिस्टिंग उल्टा करने के लिए दो संभावनाएं हैं।

विकल्प 1: अपने पद मॉडल में तुम इतनी तरह अपने रिश्ते की घोषणा कर सकते हैं:

class Post < ActiveRecord::Base 
    has_many :comments, :order => "created_at DESC" 
end 

विकल्प 2: अपने सूचकांक ध्यान में रखते हुए, बस उन्हें प्रदर्शित करने से पहले प्रत्येक पोस्ट की टिप्पणियों की सरणी रिवर्स:

<% @posts.each do |post| %> 
    <%= render :partial => post %> 
    <%= render :partial => post.comments.reverse %> 
<% end %> 

विकल्पों में अलग-अलग उपयोग के मामले हैं। विकल्प 1 में, आप कह रहे हैं कि पूरे पूरे एप्लिकेशन में, जब भी आप किसी पोस्ट पर टिप्पणियों का संदर्भ लेते हैं, तो उन टिप्पणियों को निर्दिष्ट क्रम में डेटाबेस से पुनर्प्राप्त किया जाना चाहिए। आप कह रहे हैं कि यह आपके आवेदन में टिप्पणियों की एक आंतरिक संपत्ति है - पोस्ट में कई टिप्पणियां हैं, जिन्हें डिफ़ॉल्ट रूप से सबसे पहले आदेश दिया जाता है।

विकल्प 2 में, आप बस प्रस्तुत किए जाने से पहले इंडेक्स पेज में टिप्पणियों को उलट रहे हैं। उन्हें अभी भी डेटाबेस से मूल आदेश (सबसे पुराना पहले) में पुनर्प्राप्त किया गया था, और वे अभी भी उस क्रम में दिखाई देंगे जहां आप अपने आवेदन में किसी पोस्ट की टिप्पणियों तक पहुंच सकते हैं।

+0

यह वास्तव में एक उपयोगी उत्तर था और यह काम किया। एक और questin (क्षमा करें)। मेरे पास show.html.erb पर काम करने के लिए AJAX सेटअप है। मैं इसे नीचे की बजाय शीर्ष पर नई टिप्पणी जोड़ने के लिए नहीं मिल सकता। मैंने कुछ चीजों की कोशिश की है लेकिन यहां कोई त्वरित शब्द है? – bgadoci

+0

आप AJAX कैसे कर रहे हैं? आरजेएस या ??? यदि आप अभी भी ब्लॉग ट्यूटोरियल का पालन कर रहे हैं, तो आप केवल बदलना चाहते हैं: create.js.rjs में पहली पंक्ति पर नीचे: शीर्ष ... यदि आपने अपने जेएस को किसी अन्य चीज़ पर स्विच किया है तो यह एक नया प्रश्न पोस्ट करने के लायक हो सकता है। –

+0

यह एक तीसरा विकल्प है जो 'डिफ़ॉल्ट' स्कोप विधि का उपयोग 'टिप्पणी' मॉडल के भीतर ही करना है। 'default_scope: order => 'create_at desc'' –

0

ऐसा लगता है कि आप find का उपयोग कर क्रम को उल्टा कर सकते हैं: Post.find(:all, :order => "created_at DESC") की तरह कुछ। टिप्पणियों पर भी यही लागू होना चाहिए।

+0

मुझे एहसास हुआ कि मैं ऊपर टिप्पणियाँ नियंत्रक गलत कोड डाल दिया। मैं उपर्युक्त टिप्पणियां नियंत्रक लाइन में ऑर्डर फ़ंक्शन कहां रखूं? – bgadoci

3
@posts = Post.find(:all, :include => :comments, :order => "published_at DESC") 
+0

मुझे एहसास हुआ कि मैंने उपरोक्त टिप्पणियाँ नियंत्रक में गलत कोड डाला है। मैं उपर्युक्त टिप्पणियां नियंत्रक लाइन में ऑर्डर फ़ंक्शन कहां रखूं? – bgadoci

6

यदि आप .each विधि के ऑर्डर को रिवर्स करने के लिए एक अधिक सामान्य तरीका ढूंढ रहे हैं, तो रेल के पास .reverse_each विधि है।इसलिए जैसा:

<% @posts.reverse_each do |post| %> 
    <%= render :partial => post %> 
    <%= render :partial => post.comments.reverse %> 
<% end %> 
0

.reverse_each विधि will_paginate

साथ जोड़ने से यहाँ समाधान है

@posts = Post.all.paginate(:order => "created_at DESC",:page => params[:page],:per_page => 5) 
0

कोशिश उपयोग: reverse_order

Client.where("orders_count > 10").order(:name).reverse_order 

इस एसक्यूएल निष्पादित करेंगे:

SELECT * FROM clients WHERE orders_count > 10 ORDER BY name DESC 

यदि क्वेरी में कोई ऑर्डरिंग क्लॉज निर्दिष्ट नहीं है, तो रिवर्स ऑर्डर में प्राथमिक कुंजी द्वारा रिवर्स_ऑर्डर ऑर्डर।

Client.where("orders_count > 10").reverse_order 

जो निष्पादित करेंगे:

SELECT * FROM clients WHERE orders_count > 10 ORDER BY clients.id DESC 

http://edgeguides.rubyonrails.org/active_record_querying.html#reorder