Rails 5 个活动记录查询未显示 left_outer_joins 属性
Rails 5 Active record query not showing left_outer_joins attributes
我正在尝试进行左外连接以获取相关属性,然后按相关属性排序。
我的问题是输出中没有列出相关属性 pfeature_id。
我在这里找不到任何关于我可能做错了什么的文章。
下面的示例 1 和 2,相关的 product_features.pfeature_id
没有显示在列表中。
在示例 3 中,原始 sql 在 sqlite3 或 mysql 中是 运行,并且显示 pfeature_id。
我提到的其中一个页面是:https://guides.rubyonrails.org/active_record_querying.html#left-outer-joins
谁能告诉我哪里做错了?
1.
albe@vamp398:/srv/test/brails/brail484b51$ dc exec web bundle exec rails console
Loading development environment (Rails 5.2.3)
irb(main):002:0> b=Product.left_joins(:product_feature).select("products.id,
products.name, product_features.pfeature_id").where("products.id>8").take(2)
Product Load (0.7ms) SELECT products.id, products.name,
product_features.pfeature_id FROM "products" LEFT OUTER JOIN "product_features" ON
"product_features"."product_id" = "products"."id" WHERE (products.id>8)
LIMIT ? [["LIMIT", 2]]
=> [#<Product id: 9, name: "redKnife">, #<Product id: 10, name: "pf">]
2.
class Product < ApplicationRecord
has_many :product_feature
has_many :pfeature, through: :product_feature
def self.pf
# raw sql select using ...
Product.find_by_sql \
<<-SQL
SELECT products.id, products.name, product_features.pfeature_id FROM products LEFT OUTER JOIN
product_features ON product_features.product_id = products.id
SQL
end
end
irb(main):005:0> b=Product.pf.last(4)
SELECT products.id, products.name, product_features.pfeature_id FROM products
LEFT OUTER JOIN product_features ON product_features.product_id = products.id
=> [#<Product id: 8, name: "11">, #<Product id: 9, name: "redKnife">,
#<Product id: 10, name: "pf">, #<Product id: 10, name: "pf">]
3.
Run this sql in sqlite3 or MySQL:
SELECT products.id, "products".name, product_features.pfeature_id FROM
"products" LEFT OUTER JOIN "product_features" ON
"product_features"."product_id" = "products"."id"
WHERE (products.id>8) LIMIT 2
id name pfeature_id
9 redKnife NULL
10 pf 8
Tables:
create_table "product_features", force: :cascade do |t|
t.string "name"
t.integer "product_id"
t.integer "pfeature_id"
...
end
create_table "products", force: :cascade do |t|
t.string "name"
...
end
问题是,如果 select
中的列不是调用 select
的模型的属性之一,则不会显示这些列。所有这些属性仍然包含在 AR::Relation
内的对象中,并且可以像任何其他 public 实例属性一样访问。例如:
products = Product.left_joins(:product_feature).select("products.id, products.name, product_features.pfeature_id").where("products.id > 8").take(2)
products.first.pfeature_id
为了验证,只需 运行 控制台中的这两行。你会得到你想要的输出。因为它是一个 LEFT JOIN
,当一个 product
没有 product_features
.
时,你可能会得到输出 nil
如果您想对输出进行排序,请记住您的排序列应包含 NOT NULL
个值。例如:
products = Product.left_joins(:product_feature).select("products.id, products.name, product_features.pfeature_id").where("products.id > 8")
# sort with your desired column
sorted_products = products.sort_by(&:name)
# or
sorted_products = products.sort_by(&:pfeature_id) # make sure `pfeatured_id` is not null for any product
我正在尝试进行左外连接以获取相关属性,然后按相关属性排序。
我的问题是输出中没有列出相关属性 pfeature_id。
我在这里找不到任何关于我可能做错了什么的文章。
下面的示例 1 和 2,相关的 product_features.pfeature_id
没有显示在列表中。
在示例 3 中,原始 sql 在 sqlite3 或 mysql 中是 运行,并且显示 pfeature_id。
我提到的其中一个页面是:https://guides.rubyonrails.org/active_record_querying.html#left-outer-joins
谁能告诉我哪里做错了?
1.
albe@vamp398:/srv/test/brails/brail484b51$ dc exec web bundle exec rails console
Loading development environment (Rails 5.2.3)
irb(main):002:0> b=Product.left_joins(:product_feature).select("products.id,
products.name, product_features.pfeature_id").where("products.id>8").take(2)
Product Load (0.7ms) SELECT products.id, products.name,
product_features.pfeature_id FROM "products" LEFT OUTER JOIN "product_features" ON
"product_features"."product_id" = "products"."id" WHERE (products.id>8)
LIMIT ? [["LIMIT", 2]]
=> [#<Product id: 9, name: "redKnife">, #<Product id: 10, name: "pf">]
2.
class Product < ApplicationRecord
has_many :product_feature
has_many :pfeature, through: :product_feature
def self.pf
# raw sql select using ...
Product.find_by_sql \
<<-SQL
SELECT products.id, products.name, product_features.pfeature_id FROM products LEFT OUTER JOIN
product_features ON product_features.product_id = products.id
SQL
end
end
irb(main):005:0> b=Product.pf.last(4)
SELECT products.id, products.name, product_features.pfeature_id FROM products
LEFT OUTER JOIN product_features ON product_features.product_id = products.id
=> [#<Product id: 8, name: "11">, #<Product id: 9, name: "redKnife">,
#<Product id: 10, name: "pf">, #<Product id: 10, name: "pf">]
3.
Run this sql in sqlite3 or MySQL:
SELECT products.id, "products".name, product_features.pfeature_id FROM
"products" LEFT OUTER JOIN "product_features" ON
"product_features"."product_id" = "products"."id"
WHERE (products.id>8) LIMIT 2
id name pfeature_id
9 redKnife NULL
10 pf 8
Tables:
create_table "product_features", force: :cascade do |t|
t.string "name"
t.integer "product_id"
t.integer "pfeature_id"
...
end
create_table "products", force: :cascade do |t|
t.string "name"
...
end
问题是,如果 select
中的列不是调用 select
的模型的属性之一,则不会显示这些列。所有这些属性仍然包含在 AR::Relation
内的对象中,并且可以像任何其他 public 实例属性一样访问。例如:
products = Product.left_joins(:product_feature).select("products.id, products.name, product_features.pfeature_id").where("products.id > 8").take(2)
products.first.pfeature_id
为了验证,只需 运行 控制台中的这两行。你会得到你想要的输出。因为它是一个 LEFT JOIN
,当一个 product
没有 product_features
.
nil
如果您想对输出进行排序,请记住您的排序列应包含 NOT NULL
个值。例如:
products = Product.left_joins(:product_feature).select("products.id, products.name, product_features.pfeature_id").where("products.id > 8")
# sort with your desired column
sorted_products = products.sort_by(&:name)
# or
sorted_products = products.sort_by(&:pfeature_id) # make sure `pfeatured_id` is not null for any product