Rails ActiveRecord Query voor het Niet Gelijk

Rails 3.2.1

Is er een manier (zonder squeel) voor het gebruik van de hash syntaxis van ActiveRecord voor de bouw van een != operator?

Iets als Product.where(id: !params[:id])

Genereert SELECT products.* FROM products WHERE id != 5

Op zoek naar het tegenovergestelde van Product.where(id: params[:id])

UPDATE

In rails 4 er is een not operator.

Product.where.not(id: params[:id])

 

4 Replies
  1. 33

    Er is geen ingebouwde manier om dit te doen (zoals Rails 3.2.13). Echter, u kunt het gemakkelijk bouwen van een methode om u te helpen:

    ActiveRecord::Base.class_eval do
      def self.where_not(opts)
        params = []        
        sql = opts.map{|k, v| params << v; "#{quoted_table_name}.#{quote_column_name k} != ?"}.join(' AND ')
        where(sql, *params)
      end
    end

    En dan kan je doen:

    Product.where_not(id: params[:id])

    UPDATE

    Als @DanMclain beantwoord – is dit al voor je gedaan in Rails 4 (met where.not(...)).

    • PLUS VOOR DE ZEKERHEID…. Maar zorg dat u de test voor null-waarden te hebben.. Ze zijn (naar mijn mening) niet gelijk zijn, maar de resulterende query GEEN records waar het veld is leeg. where_not(:status => ‘actieve’) bijvoorbeeld..
    • Ook te worden beschouwd… where_not_or Werknemer.waar(:id=>1).where_not_or(:job_title=>’Awesome’, :loon=>10000000).update_all(:job_title=>’Awesome’, :loon=>10000000, :updated_at => Tijd.nu zou alleen een update als er dingen veranderd
    • SQL standaard voor null-waarden is te nooit terug tenzij uitdrukkelijk gecontroleerd aan de hand IS NULL of IS NIET NULL is. Dus ik ben het oneens dat het bellen != moet dit wijzigen. Het toevoegen van een or methode zou zeer gunstig zijn, maar op dit punt met behulp van Arel of Squeel is makkelijker dan opnieuw het wiel uitvinden.
  2. 82

    Kunt u gebruik maken van de volgende

    Product.where('id != ?', params[:id])

    Die zal leiden tot wat u zoekt, terwijl parameterizing de query.

    Met Rails 4, wordt de volgende syntaxis is toegevoegd aan ondersteuning niet clausules

    Product.where.not(id: params[:id])

    Het toevoegen van meerdere componenten met chaining…

    Product.where.not(id: params[:id]).where.not(category_id: params[:cat_id])
    • Dit kan werk unexcepted wanneer params[:id] is nihil. In rails 3.2.X ik gebruik Product.where('id != ?', params[:id].to_i)
    • In rails 3, gelieve te adviseren, als er meerdere id ‘ s is, hoe dat te doen? ex. – Product.waar(‘id != ?’, 10000, 10001, 10004, 10035, 10088)
  3. 24

    Rails 4 heeft dit bedacht. Dus misschien kan je gewoon updaten van uw rails app

    Model.where.not(:id => params[:id])
    • Lol, upgrade Rails aan het verbeteren van de syntaxis van zijn AR bellen? I love it, ik wou dat ik kon gaan naar mijn management en krijgen sommige van onze oude platforms een upgrade!
    • Start uw eigen bedrijf _(ツ)_/
  4. 13

    Arel kan de degene die je zou willen om Het te verkennen is opgenomen in Rails 3+ ik denk dat

    Hier Hoe u doen met behulp van Arel

    Product.where(Product.arel_table[:id].not_eq(params[:id]))

    en

    Product.where(Product.arel_table[:id].not_eq(params[:id])).to_sql 

    zou het genereren van SQL, Zoals hieronder

    SELECT `products`.* FROM `products`  WHERE (`products`.`id` != 1)

    Hoop dit Help

    • Hoe query op meerdere kenmerken met deze syntaxis??

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *