Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • 0
Argos

Como recuperar uma única imagem de uma tabela associada?

Pergunta

(Usando Rails 4)

Tenho uma tabela chamada "Products" e outra chamada "ProductImages", onde todas as imagens dos "Products" estão guardadas:

Models:

class Product < ActiveRecord::Base
  has_many :product_images
end

class ProductImage < ActiveRecord::Base
  belongs_to :product
end

Controller:

@products = Product.all

Views

<% @products.each do |product| %>
  <%= product.name %>
  <%= product.price %>
<% end %>

Minha dúvida é: Como mostrar apenas a primeira imagem de cada produto na View junto ao nome e ao preço?

Desconsiderando o helper 'image_tag' por enquanto, para recuperar a primeira imagem, estou tentando usar:

<%= product.product_images.first %>

Mas ele me retorna um "ActiveRecord::Associations".

É possível pegar dados de uma "ActiveRecord::Associations" diretamente em uma View? Ou devo transforma-la em array? Ou ainda, devo criar um método, ou um 'scope', no Model?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

4 respostas a esta questão

Recommended Posts

Valeu Anderson! Eu estava insistindo na tentativa de recuperar essa imagem diretamente na View, considerando que não haveria produtos sem imagens (o campo é obrigatório), mas havia um produto de teste que estava sem a imagem. Usando o método com os operadores if else deu tudo ok.

Mais uma vez, mto obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, é possível, mas você pode optar por um método no produto para retornar a imagem principal com um fallback para uma imagem padrão, exemplo:

 

 

class Product < ActiveRecord::Base
  has_many :product_images
 
  def main_image
    first_image = product_images.first
    if first_image
      # retorna a imagem principal
    else
      # retorna uma imagem padrão
    end
  end
end

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Anderson, mas meu problema está mais na parte "# retorna a imagem principal"....
Vou tentar me explicar melhor.

 

Sei que o Active Records me possibilita recuperar dados usando os nomes das colunas da tabela como atributos em uma instância do Model. Então, na minha View, consigo pegar o nome dos produtos usando "product.name":

<% @products.each do |product| %>
  <%= product.name %>
<% end %>

Como eu tenho uma outra tabela, chamada "product_images", associada a essa tabela "products", eu não deveria estar apto a recuperar o nome da imagem (armazenada na coluna 'image') fazendo o seguinte?

<% @products.each do |product| %>
  <%= product.name %>
  <%= product.product_images.image %>
<% end %>

Ou, como a associação é do tipo has_many (várias imagens para um produto) e só quero a primeira imagem, não poderia fazer o seguinte?

<% @products.each do |product| %>
  <%= product.name %>
  <%= product.product_images.first.image %>
<% end %>

Mas em ambos os caso, recebo:

undefined method `image' for nil:NilClass

 

O arquivo de migração da tabela "product_images":

class CreateProductImages < ActiveRecord::Migration
  def change
    create_table :product_images do |t|
      t.belongs_to :product, index: true, foreign_key: true
      t.string :image

      t.timestamps null: false
    end
  end
end

Onde eu estou errando? Me parece ser uma coisa tão boba, mas infelizmente estou travado nisso há dias..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está tudo certo, porém existe produto sem imagem.

 

Você pode fazer assim:

 

class Product < ActiveRecord::Base
  has_many :product_images
 
  def main_image
    first_image = product_images.first
    if first_image
      return first_image.image
    else
      return 'imagem padrão'
    end
  end
end

 

Depois

 

<% @products.each do |product| %>
  <%= product.name %>
  <%= product.main_image %>
<% end %>

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Alkindar33
      Ultimamente tenho ficado em dúvida sobre o futuro das linguagens em relação a mercado de trabalho, eu trabalho atualmente com NodeJS mas sinto que a linguagem está se reproduzindo como coelho em termos de desenvolvedores aprendendo ela e por causa da lei de oferta do mercado tende a se pagar menos e etc e não estou muito contente com a linguagem em si. Mas tenho dúvida de qual linguagem escolher para conseguir melhores salários e qual deve crescer mais a longo prazo. Linguagens que eu vi para Web: Go, Elixir, Ruby e Rust.
      Alguém tem alguma ideia de qual pode ser uma boa linguagem para focar o aprendizado?
    • Por dayvidham
      Olá, atualmente faço parte de uma comunidade brasileira que está imersa em um projeto DeFi de um Token que roda na rede BSC.
      Temos um Token chamado SkyRocketSR criado a 31 dias e ja somos mais de 5000 pessoas interessadas no seu sucesso.
      Estamos em busca de programadores, designers e todos que poderem somar à comunidade de alguma forma.
      Alguém gostaria de saber mais do projeto e quem sabe compor a equipe da linha de frente já que somos uma comunidade?
      Obrigado e contamos com você.

      https://skyrocketsr.com/en/

      Aqui há mais sobre nós!
    • Por dayvidham
      Olá, atualmente faço parte de uma comunidade brasileira que está imersa em um projeto DeFi de um Token que roda na rede BSC.
      Temos um Token chamado SkyRocketSR criado a 31 dias e ja somos mais de 5000 pessoas interessadas no seu sucesso.
      Estamos em busca de programadores, designers e todos que poderem somar à comunidade de alguma forma.
      Alguém gostaria de saber mais do projeto e quem sabe compor a equipe da linha de frente já que somos uma comunidade?
      Obrigado e contamos com você.

      https://skyrocketsr.com/en/

      Aqui há mais sobre nós!
    • Por dayvidham
      Olá, atualmente faço parte de uma comunidade brasileira que está imersa em um projeto DeFi de um Token que roda na rede BSC.
      Temos um Token chamado SkyRocketSR criado a 31 dias e ja somos mais de 5000 pessoas interessadas no seu sucesso.
      Estamos em busca de programadores, designers e todos que poderem somar à comunidade de alguma forma.
      Alguém gostaria de saber mais do projeto e quem sabe compor a equipe da linha de frente já que somos uma comunidade?
      Obrigado e contamos com você.

      https://skyrocketsr.com/en/

      Aqui há mais sobre nós!
    • Por Ross Risso
      Olá pessoal!
      Estou com problemas para inserir as compras no banco de dados.
      até aqui funciona, mas se tendo adicionar outros dados ele não aceita. Só permite adicionar $id e $qtd. Ainda tenho que adicionar o ID do pedido e o valor da mercadoria. Alguém poderia me ajudar?
          <?php   foreach($_SESSION['carrinho'] as $id => $qtd){              $sql = "INSERT INTO tbldetped (MercDetPed, QuantDetPed) VALUES ('$id','$qtd')";         $qr = mysqli_query($conn, $sql);          } ?>
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.