2014-10-12 4 views
1

언어 모델, 질문 모델 및 응답 모델이있는 응용 프로그램을 작성하고 있습니다. 나는 다음과 같은 범주로 하나 "내 질문"인덱스 뷰 페이지에 대한 질문의 목록과 답변을 표시 할 것 : 하나의보기에서 데이터를 분류하는 방법

  • 내 답변 된 질문 (현재 사용자에 속하는 질문을 의미)

    1. 내 대답없는 질문은 (현재 사용자에 속하는 경우에만 응답)을 의미 현재 사용자에 속하는 경우에만 질문) 나는 답변
    2. 질문 (의미

    내가 프로그래밍에 새로운 오전 잘 모르겠어요 경우 단어를 연구 "카테고리"에서 Rails는 이에 대한 올바른 용어였습니다. t이 방법으로 도움이되는 정보를 찾을 수 없었습니다. 어떤 통찰력이라도 대단히 감사 할 것입니다! 여기

    내 경로입니다 : 여기
    class Question < ActiveRecord::Base 
        require 'obscenity/active_model' 
        has_many :answers, dependent: :destroy 
        accepts_nested_attributes_for :answers, :reject_if => :all_blank, :allow_destroy=>true 
        belongs_to :user 
        belongs_to :language 
    
        default_scope { order('created_at DESC') } 
    
    
        validates :body, obscenity: true 
        validates :body, length: { minimum: 10, maximum: 160 }, presence: true 
        validates :user, presence: true 
    
    end 
    

    내 대답 모델입니다 :

    여기
    Languagecheck::Application.routes.draw do 
        devise_for :users 
        resources :users 
    
        resources :languages do 
        resources :questions, except: [:index] do 
         resources :answers 
        end 
        end 
    
        resources :questions, only: [:index, :new, :create] 
    
        get 'about' => 'welcome#about' 
        root to: 'welcome#index' 
        end 
    

    내 질문 모델입니다

    class Answer < ActiveRecord::Base 
        require 'obscenity/active_model' 
        belongs_to :question 
        belongs_to :user 
    
    validates :name, obscenity: true 
    validates :body, length: { minimum: 1, maximum: 160 }, presence: true 
    
    end 
    

    내 사용자 모델을 설정 곳 사용자는 많은 질문과 답변을 가지고 있습니다.

    다음
    class QuestionsController < ApplicationController 
        before_action :set_language, except: [:index] 
        before_action :set_question, only: [:show, :edit, :update, :destroy] 
    
        def index 
        @questions = current_user.questions 
        end 
    
        def show 
        @question = Question.find(params[:id]) 
        @answer = Answer.new 
        end 
    
        def new 
        @question = Question.new 
        authorize @question 
        end 
    
        def edit 
        @question = Question.find(params[:id]) 
        authorize @question 
        end 
    
        def update 
        @question = Question.find(params[:id]) 
        authorize @question 
    
        if @question.update_attributes(question_params) 
         flash[:notice] = "Question was updated." 
         redirect_to [@language, @question] 
        else 
         flash[:error] = "There was an error saving the question. Please try again." 
         render :edit 
        end 
        end 
    
        def create 
        @question = Question.new(question_params) 
        @question.language = @language 
        @question.user = current_user 
        authorize @question 
    
        if @question.save 
         flash[:notice] = "Question was saved." 
         redirect_to [@language, @question] 
        else 
         flash[:error] = "There was an error saving the question. Please try again." 
         render :new 
        end 
        end 
        def destroy 
        @question.destroy.find(params[:id]) 
        respond_to do |format| 
         format.html { redirect_to questions_url } 
         format.json { head :no_content } 
        end 
        end 
    
        private 
        def set_question 
         @question = Question.find(params[:id]) 
        end 
    
        def question_params 
         params.require(:question).permit(:id, :body) 
    
        end 
    
        def set_language 
         @language = Language.find(params[:language_id]) 
        end 
    
    end 
    

    내 대답 컨트롤러 :

    class AnswersController < ApplicationController 
        before_action :set_language_and_question 
        before_action :set_answer, only: [:show, :edit, :update, :destroy] 
    
        def index 
        @answers = Answer.all 
        end 
    
        def show 
        end 
    
        def new 
        @answer = Answer.new 
        end 
    
        def edit 
        end 
    
        def create 
        @answer = Answer.new(answer_params) 
        @answer.question = @question 
        @answer.user = current_user 
    
        respond_to do |format| 
         if @answer.save 
         format.html { redirect_to [@language, @question], notice: 'Answer was successfully created.' } 
         format.json { render action: 'show', status: :created, location: @answer } 
         else 
         format.html { redirect_to [@language, @question], error: 'Answer was not successfully created.' } 
         format.json { render json: @answer.errors, status: :unprocessable_entity } 
         end 
        end 
        end 
    
        def update 
        respond_to do |format| 
         if @answer.update(answer_params) 
         format.html { redirect_to @answer, notice: 'Answer was successfully updated.' } 
         format.json { head :no_content } 
         else 
         format.html { render action: 'edit' } 
         format.json { render json: @answer.errors, status: :unprocessable_entity } 
         end 
        end 
        end 
    
        def destroy 
        @answer.destroy 
        respond_to do |format| 
         format.html { redirect_to answers_url } 
         format.json { head :no_content } 
        end 
        end 
    
        private 
    
        def set_answer 
         @answer = Answer.find(params[:id]) 
         @answer ||= @question.answers.new 
        end 
    
        def answer_params 
         params.require(:answer).permit(:id, :body) 
        end 
    
        def set_language_and_question 
         @language = Language.find(params[:language_id]) 
         @question = Question.find(params[:question_id]) 
        end 
    end 
    

    그리고 여기에 "내 질문"보기 (이 단지 순간에 모든 질문을 나열한다)는 다음

    내 질문 컨트롤러 :

    <div class="row"> 
        <div class="col-md-8"> 
         <h3>My Unanswered Questions</h3> 
         <% @questions.each do |question| %> 
         <div class="media"> 
          <div class="media-body"> 
          <h4 class="media-heading"> 
         <p><%= question.language ? link_to(question.body, [question.language, question]) : question.body %></p> 
          </h4> 
          <small> 
           submitted <%= time_ago_in_words(question.created_at) %> ago by <%= question.user.name %> <br/> 
           <%= question.answers.count %> Answers 
          </small> 
          </div> 
         </div> 
         <% end %> 
         </div> 
         <br/> 
         <br/> 
        <div class="col-md-4"> 
         <%= link_to "Ask a New Question", new_question_path, class: 'btn btn-success' %> 
        </div> 
    </div> 
    
    <div class="row"> 
        <div class="col-md-8"> 
         <h3>My Answered Questions</h3> 
         <% @questions.each do |question| %> 
         <div class="media"> 
          <div class="media-body"> 
          <h4 class="media-heading"> 
         <p><%= question.language ? link_to(question.body, [question.language, question]) : question.body %></p> 
          </h4> 
          <small> 
           submitted <%= time_ago_in_words(question.created_at) %> ago by <%= question.user.name %> <br/> 
           <%= question.answers.count %> Answers 
          </small> 
          </div> 
         </div> 
         <% end %> 
         </div> 
    </div> 
    
    <div class="row"> 
        <div class="col-md-8"> 
         <h3>Questions I Answered</h3> 
         <% @questions.each do |question| %> 
         <div class="media"> 
          <div class="media-body"> 
          <h4 class="media-heading"> 
         <p><%= question.language ? link_to(question.body, [question.language, question]) : question.body %></p> 
          </h4> 
          <small> 
           submitted <%= time_ago_in_words(question.created_at) %> ago by <%= question.user.name %> <br/> 
           <%= question.answers.count %> Answers 
          </small> 
          </div> 
         </div> 
         <% end %> 
         </div> 
    </div> 
    
  • +1

    카테고리별로 언급 한 내용이 100 % 명확하지는 않지만 질문 모델에 3 가지 범위 (3 가지 사례 각각에 하나씩)를 추가하고 3 가지를 채우기 위해 충분합니다. 당신의'QuestionsController # index'에 인스턴스 변수를 넣고 템플릿에있는 것들을 사용합니까? – Matt

    +0

    그들은 대답하지 않은/대답하는/대답 한 3 가지 카테고리로 그룹을 말하고 있습니다. 나는 두 가지 하위 유형의 질문 (대답/대답 안함)을 갖고 있고 두 번째 유형은 대답이라고 생각하고 있습니다. 그 중 하나 또는 두 가지 유형 : 질문/답변, 당신이 group_by on을 사용하는 응답 부울을 가진 질문. –

    답변

    0

    발레리,

    Matt와 마찬가지로, 나는 당신이 "분류"하는 것을 완전히 확신하지 못합니다. 특정 페이지에서 다양한 질문 그룹을 반복 할 수있게하려는 것 같습니다. 따라서 다음과 같이됩니다.

    <% @user.unanswered_questions.each do |question| %> 
        ... 
    <% end %> 
    
    <% @user.answered_questions.each do |question| %> 
        ... 
    <% end %> 
    
    <% @user.answers.each do |answer| %> 
        ... 
    <% end %> 
    

    단일보기.

    그게 무슨 뜻 이냐면 Matt의 제안은 맞는 것 같습니다. 그 목적을 달성하기 위해 question.rb에 범위 또는 메소드를 작성하면됩니다.

    scope :answered, -> { joins(:answers) } 
    scope :unanswered, -> { where.not(id: joins(:answers).pluck(:id)) } 
    

    당신은 다음 @user.questions.answered@user.questions.unanswered 할 수있을 것입니다 (위의 약간 다르지만 하나는 옵션입니다) : 사실 문제에 아래의 범위를 만들 것입니다. 두 번째 것은 약간 복잡합니다. 기본적으로 응답 (joins(:answers)), 해당 ID (pluck(:id))를받은 다음 해당 컬렉션에없는 아이디 (즉, 대답이없는 아이디)로 모든 질문을 포착합니다. 나는 이 작동한다고 생각하는을 테스트했지만 아직 테스트하지 않았습니다. 자세한 내용은 AR 문서를 확인하십시오. http://guides.rubyonrails.org/active_record_querying.html

    그게 무슨 뜻입니까?일반적으로 Rails에서는 데이터를 세분화 (또는 분류)하는 것과 관련하여이 기능을 가장 추상적 인 모델 레이어로 푸시하는 방법에 대해 생각해보고 싶습니다.

    또한 이러한 범위는 클래스 메서드 일 수도 있습니다. AR 관계를 반환하는 한 실제로 큰 차이가 없으므로 "연결"될 수 있습니다.

    관련 문제