Преобразование объекта ActiveRecord в массив - PullRequest
0 голосов
/ 31 мая 2018
 collected_cards.each do |card|
      ac = Card.find_by('name like ?', "#{card}")

      if ac.nil?
        next
      else
        confirmed_cards << ac
      end
    end

Я анализирую массив строк.Для каждой строки я пытаюсь собрать имя из моего postgres ac = Card.find_by('name like ?', "#{card}")

Проблема в том, что объект AC не воспринимается Ruby / Rails как массив или даже хеш, что приводит меня к этой ошибкекогда я пытаюсь отобразить его в моем представлении:

undefined method `each' for #<Card:0x007f9368494a50>

Вот небольшой фрагмент кода представления:

<% @cardset.each do |cardset| %>
  <% cardset.each do |collection| %> # I get an error here
    <h1>Cards matching <%= collection.first[:name] %></h1>
    <% collection.each do |card| %>
      <%= image_tag "#{card[:image]}" %>
      <%= card[:name] %>

cardset должен быть массивом массивов хешей, которые яитерация (контекст)

Спасибо!

Редактировать: Метод в моем контроллере, отвечающий за это представление:

def cards
    @collection = params[:imgur_link]
    unique_path = @collection.gsub("https://imgur.com/a/", "")
    @imgur = ImgurService.new(unique_path).call
    @ocr = OcrService.new(@imgur).call
    @cardset = CardsService.new(@ocr).call
end

CardService:

def initialize(ocrservice)
    @cards_from_ocr = ocrservice
  end

  def call
    match_ocr_with_ac
    # display_max_price
  end

  def match_ocr_with_ac
    confirmed_cards = []
    collected_cards = @cards_from_ocr

    collected_cards.each do |card|
      ac = Card.find_by('name like ?', "#{card}")

      if ac.nil?
        next
      else
        confirmed_cards << ac
      end
    end

    confirmed_cards
  end

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Предполагая, что в таблице cards есть поле с именем card_text, содержащее нужную строку, код, который вы ищете, может быть:

collected_cards.pluck(:card_text).each do |card_text|
  ac = Card.find_by('name like :pattern', pattern: "%#{card_text}%")
  next unless ac
  confirmed_cards << ac
end

или

confirmed_cards = collected_cards.pluck(:card_text).select do |card_text|
  Card.find_by('name like :pattern', pattern: "%#{card_text}%")
end

Pluck возьмет коллекцию активных объектов записей и вернет массив только тех полей, которые вы указали.

Мне больше нравится использовать связанные параметры с синтаксисом имени двоеточия, потому что он не связан спорядок связанных параметров.

0 голосов
/ 31 мая 2018

Метод find_by находит первую запись, соответствующую некоторым условиям ( source )

Если вы хотите вставить в confirmed_cards массив записей сто же самое имя, которое вы должны сделать:

ac = Card.where('name like ?', "#{card}").to_a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...