has-many-through 相关问题

在Ruby on Rails中,has_many:through关联通常用于与另一个模型建立多对多连接。该关联表明通过继续第三模型,声明模型可以与另一模型的零个或多个实例匹配。

启用多对多API查询

情况我有3个模型,如下类House

回答 1 投票 0


在Active Admin中选择'has_many through'关联

[我已经看到了一些相同的问题,例如通过Active Admin使用HABTM或Has_many,但我仍在努力工作(我在...

回答 1 投票 2

将记录加入到范围内的最佳方法是什么?

我正在研究Ruby on Rails应用程序(尽管这实际上更多是一个数据结构问题),其中我将Posts,Books和Chapters作为模型。假设一个想能够引用多个...

回答 1 投票 0

Rails has_many:通过关联问题

我有一个具有三种模型的应用程序-用户,相册和审阅。目前,评论是我的联接表。一个用户有很多评论,并且通过评论有很多相册。相册有很多评论,并且有很多...

回答 1 投票 0

Rails-使用has_many上的连接模型进行过滤

如何在通过关系链接has_many的设施的场所表上添加过滤器?这是所有模型的样子:class Place

回答 1 投票 0

Rails has_many through with specific id

我正在尝试创建以下内容:模型:用户,帐户,事务逻辑:用户有多个帐户。帐户有很多交易。用户通过帐户有很多交易。 MODELS类User&...

回答 2 投票 0

Laravel hasManyThrough返回空数组

根据您提供的详细信息,应该像这样。

回答 1 投票 0

多级has_many,通过has_and_belongs_to_many

我正在尝试在Rails中建立一个三层关系,看起来像这样。 + --------- + + --------- + |品牌1 | |品牌2 | ++ ------ +-+ + --- + --- +-+ | `------------ | ---......>

回答 1 投票 1


我如何通过关系来强制rails对has_many不使用缓存的结果?

我有以下三种模型(大大简化了):类A :bs结束类B ] > 我对此问题进行了更多研究。尽管使用clear_association_cache非常方便,但是在使缓存无效的每个操作之后添加它都不会感到DRY。我认为Rails应该能够对此进行跟踪。幸运的是,有一种方法! 我将使用您的示例模型:A(有很多B,有很多C到B),B(属于A,有很多C)和C(属于B)。 我们需要对touch: true方法使用belongs_to选项。此方法更新父模型上的updated_at属性,但更重要的是,它还会触发after_touch回调。每当B或C的相关实例被修改,创建或销毁时,此回调使我们可以自动清除A的任何实例的关联缓存。 首先修改B和C的belongs_to方法调用,然后添加touch:true class B < ActiveRecord::Base belongs_to :a, touch: true has_many :cs end class C < ActiveRecord::Base belongs_to :b, touch: true end 然后将after_touch回调添加到A class A < ActiveRecord::Base has_many :bs has_many :cs, through: :bs after_touch :clear_association_cache end 现在,我们可以放心地破解,创建各种方法来修改/创建/销毁B和C的实例,并且它们所属的A实例将自动具有最新的缓存,而无需我们记住调用clear_association_cache到处都是。 取决于您使用模型B的方式,您可能还希望在其中添加after_touch回调。 belongs_to选项和ActiveRecord回调的文档: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.htmlhttp://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to 希望这会有所帮助! ((编辑:请参见Daniel Waltrip的答案,他远胜于我的) 因此,在输入所有内容并检查不相关的内容之后,我的目光投向了Association Basics指南的“ 3.1控制缓存”部分。 我将成为一个好男孩,并分享答案,因为我花了大约八个小时使无聊的谷歌搜索令人沮丧。 但是如果您想重新加载缓存,因为数据可能已经被应用程序的其他部分更改了吗?只要正确地传递给关联电话: 013 > a2.cs(true) C Load (0.2ms) SELECT "cs".* FROM "cs" INNER JOIN "bs" ON "cs"."b_id" = "bs"."id" WHERE "bs"."a_id" = 2 => [#<C id: 1, b_id: 1>] 所以故事的寓意是:RTFM;全部。 编辑:因此,必须将true放在所有位置可能不是一件好事,因为即使不需要缓存也将绕过缓存。 Daniel Waltrip的评论中提供的解决方案要好得多:使用clear_association_cache 013 > a2.clear_association_cache 014 > a2.cs C Load (0.2ms) SELECT "cs".* FROM "cs" INNER JOIN "bs" ON "cs"."b_id" = "bs"."id" WHERE "bs"."a_id" = 2 => [#<C id: 1, b_id: 1>] 所以现在,我们不仅应该RTFM,还应该在代码中搜索:nodoc:! 我发现了另一种禁用查询缓存的方法。在您的模型中,只需添加一个default_scope class B < ActiveRecord::Base belongs_to :a has_many :cs end class C < ActiveRecord::Base default_scope { } # can be empty too belongs_to :b end 已验证它可以在本地工作。我通过查看active_record / associations / association.rb :中的active_record源代码发现了这一点 # Returns true if statement cache should be skipped on the association reader. def skip_statement_cache? reflection.scope_chain.any?(&:any?) || scope.eager_loading? || klass.current_scope || klass.default_scopes.any? || reflection.source_reflection.active_record.default_scopes.any? end 所有关联方法都是围绕缓存构建的,它使最新查询的结果可用于进一步的操作。缓存甚至在方法之间共享。例如: customer.orders # retrieves orders from the database customer.orders.size # uses the cached copy of orders customer.orders.empty? # uses the cached copy of orders 但是如果您想重新加载缓存,因为数据可能已被应用程序的其他部分更改了,该怎么办?只需将true传递给关联调用即可: customer.orders # retrieves orders from the database customer.orders.size # uses the cached copy of orders customer.orders(true).empty? # discards the cached copy of orders # and goes back to the database 来源http://guides.rubyonrails.org/association_basics.html 要清除缓存,请使用.reload author.books # retrieves books from the database author.books.size # uses the cached copy of books author.books.empty? # uses the cached copy of books author.books # retrieves books from the database author.books.size # uses the cached copy of books author.books.reload.empty? # discards the cached copy of books # and goes back to the database 来源:Controlling caching

回答 5 投票 11

如何通过关系创建相同has_many的作用域选择

我正在产品管理部分。我有productvariant,可以通过productvariantdetails获得许多productattributevalues。产品属性值(绿色,黄色,S,XL)属于…[

回答 1 投票 0


通过访问器更改hasManyThrough()关系属性名称

我有3个模型Campaign PK(id)CampaignMedium FK(campaign_id)AccountReceivableable FK(campaign_medium_id)(具有金额列)控制器功能:public function all(){return Campaign :: with(...

回答 1 投票 0


Rails HABTM:through

我在3个不同的商店中都有产品。.所有商店可能都具有相同的产品,但是库存可以不同,价格也可以不同。.我认为通过BABTM将是最好的解决方案类产品...

回答 1 投票 0

Laravel有很多通过

我的餐桌产品-ID-名称product_variants-ID-product_id-color_id product_colors-id-十六进制我不想有这样的关系Product :: colors(); //获取所有...

回答 1 投票 0

通过模型设置has_many的5个时间戳无效

[TLDR:检查您的灯具! (请参见下面的答案)gem'rails','5.2.3'我有两个模型,分别是has_many“ through”关系中的People和Puppies。联接模型为Companion。类Person ...

回答 1 投票 1

当我尝试创建连接模型时,我在参数中得到空值

我正在通过与Party和Guest的关系来创建has_many的加入模型,但是我得到了空的参数[:party_id]。用户以访客身份登录,访客可以看到所有聚会列表,...

回答 1 投票 0

Laravel的hasMany通过属于关联关系

是否有可能通过同级模型的属于关联关系,检索父模型的的hasMany关系。我有以下型号:大众汽车车轮功能(){$返回本 - &...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.