【发布时间】:2016-03-12 09:18:33
【问题描述】:
我很难搜索符号的含义,例如 <> 在 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-on-rails