gpt4 book ai didi

sql - Rails 查询中的 `<>` 是什么意思?

转载 作者:行者123 更新时间:2023-12-01 22:25:16 24 4
gpt4 key购买 nike

我很难搜索符号的含义,例如 <>意味着在 rails 查询中。那么<>是什么意思呢?意思是? (或者一般来说,您如何通过谷歌搜索类似 <> 的内容?)

简而言之

用简单的英语来说,以下查询是什么意思?

查询 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声明将这些符号转换为适当的整数。

关于sql - Rails 查询中的 `<>` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35951585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com