gpt4 book ai didi

ruby-on-rails - 加入嵌套关联,多级

转载 作者:行者123 更新时间:2023-12-04 06:28:27 25 4
gpt4 key购买 nike

对于那些非常了解 rails 和 sql 的人,我正在寻找一些您可以指向我的好信息。我的查询与本节中的“加入嵌套关联”示例非常相似 - http://guides.rubyonrails.org/active_record_querying.html#using-array-hash-of-named-associations

我的模型(缩写)如下,

User has_many :products    # User is 'great-grandparent'
Product has_many :posts # Product is grandparent #1
Event has_many :posts # Event is grandparent #2
Post belongs_to :event
Post belongs_to :product
Post has_many :orders # Post is parent
Order belongs_to :post # Order is great-grandchild, grandchild, & child

我想从用户(卖家)的事件中收集订单,这是我最好的解决方法。
class Order < ActiveRecord::Base
def self.collect_for_seller_and_event(user_id, event_id)
self.joins(:post => [{:product => :user }, :event]).where(:post => [{:product => {:user_id => user_id}}, {:event_id => event_id}])
end

这个连接应该是什么样的?

我应该将其分解为菊花链上各种型号的范围吗?

只是为了表明我对这里有一个基本的了解,我已经能够开始我的第一个工作嵌套连接表(我对这一成就感到非常兴奋)
BuyerFeedback 
belongs_to :order
def self.from_past_events
self.joins(:order => {:post => :event}).where(:order => {:post => {:event => {:date.lt => Date.today}}})
end

最佳答案

您将其分解为范围的想法很好。但是您可能不必像您想象的那样用菊花链连接,因为您可以将其他模型的范围合并到任何关联的模型中。这是一篇关于 ARel#merge 的精彩文章,它使这件美妙的事情成为可能:http://ben.hoskings.net/2012-07-04-arel-merge-a-hidden-gem

通过这种方式,您可以将您的想法分解成更小的块。因此,从 Post 开始并创建一个范围,为您提供给定用户的所有相关产品。然后创建一个范围,将该范围链接到一个范围上,该范围可以为您提供给定事件的所有帖子。然后将此范围合并到您的用户范围中。

Product
scope :for_user, ->(user) { where(user_id: user) } # The passed in `user` can be an instance of user or an id

Post
scope :for_product, ->(product) { where(product_id: product) }
scope :for_product_given_user, ->(product, user) { for_product(product).merge(Product.for_user(user)) }
scope :for_product_given_user_and_event, ->(product, user, event) { for_product_given_user(product, user).where(event_id: event) }

鉴于我无法测试,我不确定我是否在正确的 rails 上......但也许这可以让你开始。这个想法是将职责分解成可管理的块,让 ARel 完成疯狂的 SQL 合并工作。

关于ruby-on-rails - 加入嵌套关联,多级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6726618/

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