我們在模型中有很多直通關系。Rails 正確地加入了關系,但是我正在努力弄清楚如何使用活動記錄將 where 搜索應用于加入的表。
例如:
class Model
has_one :relation1
has_one :relation2, through: :relation1
has_one :relation3, through: :relation2
end
如果所有的關系都是不同的模型,我們很容易使用where. 問題出現 rails 開始給模型起別名。
例如,Model.joins(:relation3).where(relation3: {name: "Hello"})不會作業,因為沒有表是別名關系 3。
是否可以使用活動記錄,或者我必須使用 arel 或 sql 來實作它?
我正在使用導軌 6.0.4。
uj5u.com熱心網友回復:
在一個簡單的查詢中,只有在沒有別名并且只使用表名時才參考表:
irb(main):023:0> puts City.joins(:country).where(countries: { name: 'Portugal'})
City Load (0.7ms) SELECT "cities".* FROM "cities" INNER JOIN "regions" ON "regions"."id" = "cities"."region_id" INNER JOIN "countries" ON "countries"."id" = "regions"."country_id" WHERE "countries"."name" = $1 [["name", "Portugal"]]
在一個更復雜的場景中,一個表被參考的次數超過了該方案似乎是association_name_table_nameand association_name_table_name_join。
class Pet < ApplicationRecord
has_many :parenthoods_as_parent,
class_name: 'Parenthood',
foreign_key: :parent_id
has_many :parenthoods_as_child,
class_name: 'Parenthood',
foreign_key: :child_id
has_many :parents, through: :parenthoods_as_child
has_many :children, through: :parenthoods_as_child
end
class Parenthood < ApplicationRecord
belongs_to :parent, class_name: 'Pet'
belongs_to :child, class_name: 'Pet'
end
irb(main):014:0> puts Pet.joins(:parents, :children).to_sql
# auto-formatted edited for readibility
SELECT "pets".*
FROM "pets"
INNER JOIN "parenthoods"
ON "parenthoods"."child_id" = "pets"."id"
INNER JOIN "pets" "parents_pets"
ON "parents_pets"."id" = "parenthoods"."parent_id"
INNER JOIN "parenthoods" "parenthoods_as_children_pets_join"
ON "parenthoods_as_children_pets_join"."child_id" = "pets"."id"
INNER JOIN "pets" "children_pets"
ON "children_pets"."id" =
"parenthoods_as_children_pets_join"."child_id"
對于更高級的查詢,如果您需要可靠地知道使用的別名,您通常需要使用 Arel 或字串撰寫自己的連接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/417918.html
標籤:
上一篇:【推薦演算法論文閱讀】Graph Convolutional Neural Networks for Web-Scale Recommender Systems
