簡體   English   中英

Rails查詢中的<<>是什么意思?

[英]What does the `<>` in Rails query mean?

我很難搜索符號的含義,例如<>在rails查詢中的含義。 那么<>是什么意思? (或者一般來說,您如何在Google中搜索<>類的東西?)

果殼

用簡單的英語來說,以下查詢是什么意思?

查詢1:

@profile.socials.all.where.not(kind: [2, 3])

查詢2:

@profile.socials.where("kind <> ?", "[:facebook, :linked_in]")

注意1: kind是數據類型enum ,如下所示:

enum kind: [ :twitter, :google_plus, :facebook, :linked_in, :skype, :yahoo ]

注意2:兩個查詢在控制台窗口中產生相同的結果。 我相信這兩個查詢都旨在對子集數據(使用不等於運算符)進行where查詢。 我只是不知道如何解釋<>任何線索。

詳細Rails應用

這些是我的模型:

型號Profile

class Profile < ActiveRecord::Base
  has_many :socials, as: :sociable, dependent: :destroy
  accepts_nested_attributes_for :socials, allow_destroy: true
end

Social模型:

class Social < ActiveRecord::Base
  enum kind: [ :twitter, :google_plus, :facebook, :linked_in, :skype, :yahoo ]
  belongs_to :sociable, polymorphic: true
  validates_presence_of :kind
  validates_presence_of :username
end

遷移文件:

class CreateProfiles < ActiveRecord::Migration
  def change
    create_table :profiles do |t|
      t.string :first_name
      t.string :last_name
      t.timestamps null: false
    end
  end
end


class CreateSocials < ActiveRecord::Migration
  def change
    create_table :socials do |t|
      t.integer :kind, null: false
      t.string :username
      t.references :sociable, polymorphic: true, index: true

      t.timestamps null: false
    end
    add_index :socials, :kind
    add_index :socials, :username
  end
end

這是我的架構:

ActiveRecord::Schema.define(version: 20160311132502) do

  create_table "profiles", force: :cascade do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "socials", force: :cascade do |t|
    t.integer  "kind",          null: false
    t.string   "username"
    t.integer  "sociable_id"
    t.string   "sociable_type"
    t.datetime "created_at",    null: false
    t.datetime "updated_at",    null: false
  end

  add_index "socials", ["kind"], name: "index_socials_on_kind"
  add_index "socials", ["sociable_type", "sociable_id"], name: "index_socials_on_sociable_type_and_sociable_id"
  add_index "socials", ["username"], name: "index_socials_on_username"

end

控制台輸入

@profile = Profile.new
@profile.first_name = parameter[:profile][:first_name]
@profile.last_name = parameter[:profile][:last_name]
@profile.socials_attributes = parameter[:profile][:socials_attributes]
@profile.save
@profile = Profile.last
@profile.socials.kinds
@profile.socials.all.where(kind: 2) # => gives you the user facebook account
@profile.socials.all.where(kind: :facebook) # => Apparently only works in Rails 5 or above.

@profile.socials.all.where(kind: [2, 3]) # => gives you the user facebook and linked_in account
@profile.socials.all.where(kind: [:facebook, :linked_in]) # => Apparently only works in Rails 5 or above.

控制台提示-Rails 4解決方法(Rails 5中不需要)

這兩個查詢是等效的(僅選擇用戶的facebook帳戶):

@profile.socials.all.where(kind: 2)

@profile.socials.all.where(kind: @profile.socials.kinds.keys.find_index("facebook"))

這兩個查詢是等效的(僅選擇用戶的facebook和linked_in帳戶):

@profile.socials.all.where(kind: [2, 3])

@profile.socials.all.where(kind: [@profile.socials.kinds.keys.find_index("facebook"), @profile.socials.kinds.keys.find_index("linked_in")])

<>是SQL語法,不是Ruby或Rails。 這意味着not equal to 它與Ruby中的!=基本相同。

SQL中<>一個細微之處是它對NULL的行為。 在SQL中,將任何內容與NULL比較都會得到NULL 例如在Postgres中:

=> select 1<>1, 1<>2, 1<>null, null<>1, null<>null;
 ?column? | ?column? | ?column? | ?column? | ?column? 
----------+----------+----------+----------+----------
 f        | t        | NULL     | NULL     | NULL

請注意,即使最后一個表達式也是NULL 通常這不是您想要的,而是可以使用IS DISTINCT FROM

=> select null is distinct from 1, null is distinct from null;
 ?column? | ?column? 
----------+----------
 t        | f

編輯:解決您的后續問題:在您的數據庫kind是一個整數。 因此,您想將其與整數進行比較:

@profile.socials.where.not(kind: [2, 3])

或者,如果您使用的是Rails 5

@profile.socials.where.not(kind: [:facebook :linked_in])

上面的方法是有效的,因為Rails 5將自動使用您的enum聲明將這些符號轉換為適當的整數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM