簡體   English   中英

Ruby on Rails-查詢多個模型

[英]Ruby on Rails - Query Multiple Models

我創建了一個ActiveRecord模型,該模型在數據庫中沒有對應的表。 我希望它管理應用程序的“范圍”查詢:

class Meter <ActiveRecord::Base
  def self.daily_tests
    self.connection.execute(sanitize_sql(["SELECT b.*, m.*, i.* FROM bgtests AS b JOIN meals AS m ON b.user_id = m.user_id JOIN injections AS i ON i.user_id = m.user_id WHERE b.user_id = 2 AND m.user_id = 2 AND i.user_id = 2"]))
  end
end

查詢執行,但是結果集返回此:

{"id"=>1, "value"=>712, "category"=>"basal", "time_of_day"=>"Before dinner", "comments"=>"Est et aut. Est maxime sunt. Dolor doloribus distinctio sed reprehenderit culpa. Autem ipsam atque modi dolor ut non. Aut dicta voluptate occaecati.", "user_id"=>2, "created_at"=>"2015-06-21 18:58:55.806367", "updated_at"=>"2015-06-21 18:58:55.806367", "name"=>"snack", "carbohydrates"=>142, "description"=>"Facere reiciendis non officia velit consequatur voluptas eum. Veritatis quia cumque. Dolor non eaque quod. Dignissimos quae aut eveniet sunt ea amet. Iste et aut unde consequatur quia commodi.", "num_of_units_taken"=>1.0, 0=>10, 1=>712, 2=>"smbg", 3=>"Before dinner", 4=>"Est et aut. Est maxime sunt. Dolor doloribus distinctio sed reprehenderit culpa. Autem ipsam atque modi dolor ut non. Aut dicta voluptate occaecati.", 5=>2, 6=>"2015-06-21 18:58:55.595625", 7=>"2015-06-21 18:58:55.595625", 8=>12, 9=>"snack", 10=>142, 11=>"Facere reiciendis non officia velit consequatur voluptas eum. Veritatis quia cumque. Dolor non eaque quod. Dignissimos quae aut eveniet sunt ea amet. Iste et aut unde consequatur quia commodi.", 12=>2, 13=>"2015-06-21 18:58:56.115615", 14=>"2015-06-21 18:58:56.115615", 15=>1, 16=>1.0, 17=>"basal", 18=>2, 19=>"2015-06-21 18:58:55.806367", 20=>"2015-06-21 18:58:55.806367"},

初始鍵值將作為列值返回,但是它隨后進行切換並添加后續記錄,例如5 => 2。

我的問題是如何在foreign_key'user_id'上查詢這些多個模型,並使結果集以特定於該模型的典型對象表示法返回所有結果?

ActiveRecord查詢接口定義的大多數方法除了在文檔中指定的其他形式外,還接受SQL字符串參數。 您也可以隨意鏈接這些方法,AR會結合起來創建一個合適的SQL。 如有疑問,請使用to_sql查看生成的SQL。 假設bgtests對應於一個名為Bgtest的模型,您可以例如執行以下操作:

Bgtest.select("b.*, m.*, i.*").from("bgtests b")
.joins("JOIN meals AS m ON b.user_id = m.user_id")
.joins("JOIN injections AS i ON i.user_id = m.user_id")
.where("b.user_id = 2 AND m.user_id = 2 AND i.user_id = 2")

方法鏈接以這種方式工作,因為每個方法都返回一個ActiveRecord :: Relation對象,該對象接受與ActiveRecord :: Base(模型子類)相同的ActiveRecord :: QueryMethods方法。 因此,方法調用的順序是任意的。 直到您嘗試從關系中提取值(無論是由於控制台調用to_s還是因為您在視圖中調用了each值),SQL才會真正執行。

請注意,通過在模型上定義正確的關聯 ,可以大大簡化上述操作(以及更多的“ Rails-y”)。 特別是,類BgtestMealInjection顯然都將調用has_many :bgtests belongs_to :user ,而User將調用has_many :bgtests等,然后可以在其他類Bgtest has_many:through選項一起使用,例如Bgtest可以調用has_many :meals, through: user等AR隨后將知道INNER JOIN僅基於引用該協會的名稱:

Bgtest.joins(:meals, :injections).where(user_id: 2)

LEFT OUTER JOIN

Bgtest.includes(:meals, :injections).where(user_id: 2)

暫無
暫無

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

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