简体   繁体   中英

Create a new hash out of Active Record results

I need to extract some of the questions i have in my database based on current_user and present them to the Current User.

So i have all questions in database, but i need only those that the current_user does not exist on the relationship between users and questions.

My code so far goes like this

    @all_questions = Hash.new
    counter = 0
    ill_questions = Question.all
    ill_questions.each do  |q|
      if !q.users.include? current_user
        @all_questions[counter] = q
        counter += 1
      end
    end
    puts "these are all unanswered questions #{@all_questions}"

when i print @all questions it gives this

{0=>#<Question id: 9, question_type: "multiple", description: "This is a question", expl
anation: "", category_id: 2, created_at: "2015-11-05 20:02:05", updated_at: "2016-02-11 19:23:02", link_name: "", link: "",

 video_url: "", image: nil, image_position: "explanation", metric: "metric test", imperial: "testers", description_type: tr
ue, restriction: false>, 1=>#<Question id: 10, question_type: "single", description: "This is another question", explanatio
n: "test", category_id: 10, created_at: "2015-12-10 12:57:10", updated_at: "2016-01-12 23:36:25", link_name: "", link: "",
video_url: "", image: nil, image_position: "question", metric: nil, imperial: nil, description_type: true, restriction: tru
e>, 2=>#<Question id: 11, question_type: "single", description: "correct-wrong", explanation: "", category_id: 11, created_
at: "2016-01-29 19:53:48", updated_at: "2016-01-29 19:53:48", link_name: "", link: "", video_url: "", image: nil, image_pos
ition: "question", metric: nil, imperial: nil, description_type: true, restriction: true>, 3=>#<Question id: 12, question_t
ype: "single", description: "New question", explanation: "", category_id: 10, created_at: "2016-01-29 19:54:18", updated_at
: "2016-01-29 19:54:18", link_name: "", link: "", video_url: "", image: nil, image_position: "question", metric: nil, imper
ial: nil, description_type: true, restriction: true>}

in my view i have this

<% @all_questions.each do |q| %>
   <p class="question-title"> <%= q.description %> </p>
<% end %>

getting error on <p class="question-title"> <%= q.description %> </p>

undefined method "description" for #<Array:0x007fe15ba18c88>

the relationship between User and Question

User has_many :questions, :through => :trackers
Question has_many :users,through: :trackers

Tracker model

Tracker(id: integer, user_id: integer, question_id: integer, answered: boolean, correct: boolean, created_at: datetime,
updated_at: datetime, category_id: integer)

What i would like to show to the current user is the questions that he did not touch, as in he does not have a relationship yet.

i assume i have something wrong in my new structure, as i see not it became an array??

Try with:

@all_questions = Question.where.not(id: current_user.question_ids)

And then use @all_questions in your view just like you wrote.

Change

<% @all_questions.each do |q| %>
   <p class="question-title"> <%= q.description %> </p>
<% end %>

To:

<% @all_questions.each do |_, q| %>
   <p class="question-title"> <%= q.description %> </p>
<% end %>

If you really don't need the key, a better solution will be:

<% @all_questions.each_value do |q| %>
   <p class="question-title"> <%= q.description %> </p>
<% end %>

@all_questions is a Hash, when use each on it, it passing the key-value pair as block parameters, you need two parameters for them, if you only provide one parameter, it will be an array like [key, value].

In your controller:

@all_questions = Question.includes(:users).where("questions.id NOT IN (?)", current_user.questions.pluck(:id))

In views:

<% @all_questions.each do |q| %>
 <p class="question-title"> <%= q.description %> </p>
<% end %>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM