在Ruby on Rails中,has_many:through关联通常用于与另一个模型建立多对多连接。该关联表明通过继续第三模型,声明模型可以与另一模型的零个或多个实例匹配。
我找到了一大堆关于 "source: "的文章、stackoverflow的答案和rails文档,但没有一篇文章以我能理解的方式解释这种关联。我需要最简化的...
在Rails中,有没有办法让关联的has_many通过与join表不是强制性的?
我想知道如何在Ruby on Rails中建立模型的关联来完成任务。我有3张表。用户,传播和组。组可以有很多用户,用户只能属于一个组。...
我有craete会员资格,用户可以购买一次获得所有用户与他们的会员资格,当他们有购买和什么时候过期,我很困惑,如何得到我的表结构是。...
下面的代码是我的种子文件。我已经在迁移和模型中设置了has many through的关系。我想知道如何创建一个recipeingredient的实例,有多 ...
我有一个has_many:through关联。类Book
在Active Admin中选择'has_many through'关联
[我已经看到了一些相同的问题,例如通过Active Admin使用HABTM或Has_many,但我仍在努力工作(我在...
我正在研究Ruby on Rails应用程序(尽管这实际上更多是一个数据结构问题),其中我将Posts,Books和Chapters作为模型。假设一个想能够引用多个...
我有一个具有三种模型的应用程序-用户,相册和审阅。目前,评论是我的联接表。一个用户有很多评论,并且通过评论有很多相册。相册有很多评论,并且有很多...
如何在通过关系链接has_many的设施的场所表上添加过滤器?这是所有模型的样子:class Place
Rails has_many through with specific id
我正在尝试创建以下内容:模型:用户,帐户,事务逻辑:用户有多个帐户。帐户有很多交易。用户通过帐户有很多交易。 MODELS类User&...
根据您提供的详细信息,应该像这样。
多级has_many,通过has_and_belongs_to_many
我正在尝试在Rails中建立一个三层关系,看起来像这样。 + --------- + + --------- + |品牌1 | |品牌2 | ++ ------ +-+ + --- + --- +-+ | `------------ | ---......>
我如何通过关系来强制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
我正在产品管理部分。我有productvariant,可以通过productvariantdetails获得许多productattributevalues。产品属性值(绿色,黄色,S,XL)属于…[
我有3个模型Campaign PK(id)CampaignMedium FK(campaign_id)AccountReceivableable FK(campaign_medium_id)(具有金额列)控制器功能:public function all(){return Campaign :: with(...
我在3个不同的商店中都有产品。.所有商店可能都具有相同的产品,但是库存可以不同,价格也可以不同。.我认为通过BABTM将是最好的解决方案类产品...