ruby-on-rails arel - Rails où la condition utilise NOT NULL




activerecord github (5)

Pas sûr de cela est utile mais ce qui a fonctionné pour moi dans Rails 4

Foo.where.not(bar: nil)

En utilisant le style 3 rails, comment écrirais-je le contraire de:

Foo.includes(:bar).where(:bars=>{:id=>nil})

Je veux trouver où id n'est pas nul. J'ai essayé:

Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql

Mais cela revient:

=> "SELECT     \"foos\".* FROM       \"foos\"  WHERE  (\"bars\".\"id\" = 1)"

Ce n'est certainement pas ce dont j'ai besoin, et cela ressemble presque à un bug dans ARel.


Ce n'est pas un bug dans ARel, c'est un bug dans votre logique.

Ce que vous voulez ici est:

Foo.includes(:bar).where(Bar.arel_table[:id].not_eq(nil))


La manière canonique de le faire avec Rails 3:

Foo.includes(:bar).where("bars.id IS NOT NULL")

ActiveRecord 4.0 et ci-dessus ajoute where.not donc vous pouvez le faire:

Foo.includes(:bar).where.not('bars.id' => nil)
Foo.includes(:bar).where.not(bars: { id: nil })

Lorsque je travaille avec des étendues entre des tables, je préfère utiliser la merge pour utiliser plus facilement les périmètres existants.

Foo.includes(:bar).merge(Bar.where.not(id: nil))

De plus, comme includes ne choisit pas toujours une stratégie de jointure, vous devez également utiliser des references ici, sinon vous risquez de vous retrouver avec un SQL non valide.

Foo.includes(:bar)
   .references(:bar)
   .merge(Bar.where.not(id: nil))

Je ne recommande plus d'utiliser Squeel pour cela, car il n'y a pas toujours un mainteneur à temps plein, et cela dépend des API privées qui provoquent des changements de fréquence fréquents.


Qu'est-ce que CSRF?

Le jeton d'authenticité est une contre-mesure à la contrefaçon de demande inter-site (CSRF). Qu'est-ce que CSRF, demandez-vous?

C'est un moyen qu'un pirate peut potentiellement pirater des sessions sans même connaître les jetons de session.

Scénario

  • Visitez le site de votre banque, connectez-vous.
  • Ensuite, visitez le site de l'attaquant (par exemple, une annonce sponsorisée provenant d'une organisation non approuvée).
  • La page de l'attaquant inclut un formulaire avec les mêmes champs que le formulaire "Transfert de fonds" de la banque.
  • L'attaquant connaît vos informations de compte et a pré-rempli les champs de formulaire pour transférer de l'argent de votre compte vers le compte de l'attaquant.
  • La page de l'attaquant inclut Javascript qui soumet le formulaire à votre banque.
  • Lorsque le formulaire est envoyé, le navigateur inclut vos cookies pour le site de la banque, y compris le jeton de session.
  • La banque transfère de l'argent au compte de l'attaquant.
  • Le formulaire peut être dans un iframe invisible, donc vous ne savez jamais que l'attaque s'est produite.
  • C'est ce qu'on appelle Cross-Site Request Forgery (CSRF).

Solution CSRF :

  • Le serveur peut marquer des formulaires provenant du serveur lui-même
  • Chaque formulaire doit contenir un jeton d'authentification supplémentaire en tant que champ masqué.
  • Le jeton doit être imprévisible (l'attaquant ne peut pas le deviner).
  • Le serveur fournit un jeton valide dans les formulaires de ses pages.
  • Le serveur vérifie le jeton lorsqu'il est posté, rejette les formulaires sans jeton approprié.
  • Exemple de jeton: identifiant de session chiffré avec la clé secrète du serveur.
  • Rails génère automatiquement de tels jetons: consultez le champ de saisie authenticity_token sous chaque forme.






ruby-on-rails rails-activerecord arel