es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El esquema Ecto utiliza la asociación “belongs_to” usando dos campos.

Tengo dos modelos: Auction y Artwork. Un Artwork pertenece_a a una Auction.

Esto se configura con una base de datos externa, por lo que las migraciones no son manejadas por Ecto, y los campos están en formato camelcase en la base de datos subyacente.

El problema al que me enfrento es que la asociación se realiza mediante dos campos (una asociación de tupla): token_id y contract_address.

Ni token_id ni contract_address son únicos, sin embargo, como tupla, sí son únicos.

Esta es la estructura de la Auction:

@primary_key {:auction_id, :id, source: :auctionId}
schema "auction" do
  field :token_id, :integer, source: :tokenId
  field :contract_address, :string, source: :contractAddress

  # idealmente, me gustaría hacer algo como esto
  belongs_to :artwork, Foundation.Artworks.Artwork,
    references: [:contract_address, :token_id]
end

Y luego la estructura de Artwork:

@primary_key {:id, :binary_id, []}
schema "artwork" do
  field :name, :string
  field :description, :string
  field :token_id, :integer, source: :tokenId
  field :contract_address, :string, source: :contractAddress
end

¿Cómo podría abordar esto para que Artwork esté asociado utilizando ambos campos?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para asociar el modelo Artwork con el modelo Auction utilizando los campos token_id y contract_address, puedes usar la opción :references en la asociación belongs_to.

    Así es como debería verse tu esquema de Auction:

    @primary_key {:auction_id, :id, source: :auctionId}
    schema "auction" do
      field :token_id, :integer, source: :tokenId
      field :contract_address, :string, source: :contractAddress
    
      belongs_to :artwork, Foundation.Artworks.Artwork,
        references: [token_id: :token_id, contract_address: :contract_address]
    end
    

    Y tu esquema de Artwork debería permanecer igual:

    @primary_key {:id, :binary_id, []}
    schema "artwork" do
      field :name, :string
      field :description, :string
      field :token_id, :integer, source: :tokenId
      field :contract_address, :string, source: :contractAddress
    end
    

    La opción :references toma una lista de palabras clave donde las claves son los campos en el esquema de la asociación y los valores son los campos en el esquema referenciado. Esto nos permite especificar tanto token_id como contract_address como referencia para el modelo Artwork.

    Con esta configuración, deberías poder obtener el registro de Artwork asociado utilizando una consulta como esta:

    auction = Repo.get(Auction, 1) # obtener un registro de subasta
    artwork = auction.artwork # obtener el registro de obra de arte asociado
    

Comments are closed.