"Nessun tale colonna" Errore quando si utilizzano la mappa seguente su Rails Tourorial - può essere causato da staffe quadrate di array?

StackOverflow https://stackoverflow.com/questions/8874614

  •  28-10-2019
  •  | 
  •  

Domanda

Sto tentando di completare Sezione 12.3 del tutorial ferroviario.org.

All'inizio della sezione 12.3, i miei test RSPEC stavano passando e il sito ha funzionato. Tuttavia, dopo aver aggiunto l'elenco nella sezione Elenco 12.42, un gran numero di test in precedenza ha iniziato a fallire. (Come parte del mio controllo degli errori, ho provato a copiare e incollare il codice direttamente dal sito di tutorial, con lo stesso risultato.) Ho tentato di aprire il sito su LocalHost e ho scoperto che i test stavano fallendo perché la home page stava restituendo un'eccezione :

Sqlite3 :: sqlexception: nessuna colonna del genere: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 , 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47 , 48, 49, 50, 51: selezionare "Micropost".* Da "Micropost" dove (user_id in ([2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 , 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 , 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51]) o user_id = 1) Ordine per Microposts.created_at Desc Limit 30 Offset 0

Rails.Root:/Users/Paulbogard/Sites/Sample_App

Il codice che sembra generare quell'eccezione è nella mia app/modelli/micropost.rb:

class Micropost < ActiveRecord::Base
  attr_accessible :content

  belongs_to :user

  validates :content, :presence => true, :length => { :maximum => 140 }
  validates :user_id, :presence => true

  default_scope :order => 'microposts.created_at DESC'

  def self.from_users_followed_by(user)
    following_ids = user.following_ids
    where("user_id IN (#{following_ids}) OR user_id = ?", user)
  end
end

Giocando con esso, sembra che non piacciano le staffe quadrate che circondano la serie di seguenti. Ad esempio, la modifica della riga di Where in questa versione del numero magico semplificato genera anche l'errore "No Tali colonne":

where("user_id IN ([2, 3, 4]) OR user_id = ?", user)

Ma se lo cambio in quanto segue, non ricevo l'errore:

where("user_id IN (2, 3, 4) OR user_id = ?", user)

E, in effetti, l'uso della versione senza quadratura non quadrata ha tutti i test che passano tranne quelli che controllano specificamente che sta restituendo post dagli utenti seguiti e non restituendo post da utenti non seguiti (come mi aspetterei semplicemente lanciando numeri magici nei Query SQL).

Quindi sembra che le parentesi quadrate sembrano far pensare a SQLite che ciò che è incluso sia un nome di colonna. C'è un modo per riscrivere il following_ids = user.following_ids linea in modo da ottenere una stringa di valori di array senza parentesi quadrate? O dovrei fare qualcos'altro del tutto?

È stato utile?

Soluzione

Lascia che ActiveRecord includa l'array nella tua domanda. In questo modo, gestisce la formattazione e persino l'eventuale fuga.

def self.from_users_followed_by(user)
  following_ids = user.following_ids
  where("user_id IN (?) OR user_id = ?", following_ids, user)
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top