如何has_many :through在 Rails/ActiveRecord 中急切加载多态关联?
这是基本设置:
class Post < ActiveRecord::Base
has_many :categorizations, :as => :categorizable
has_many :categories, :through => :categorizations
end
class Category < ActiveRecord::Base
has_many :categorizations, :as => :category
has_many :categorizables, :through => :categorizations
end
class Categorization < ActiveRecord::Base
belongs_to :category, :polymorphic => true
belongs_to :categorizable, :polymorphic => true
end
Run Code Online (Sandbox Code Playgroud)
假设我们想要解决 Rails 2.3.x 的急切加载问题以及连接模型上的双重多态关联,那么如何急切加载:through这样的关联:
posts = Post.all(:include => {:categories => :categorizations})
post.categories # no SQL call because they were eager loaded
Run Code Online (Sandbox Code Playgroud)
这不起作用,有什么想法吗?
我有以下内容:
我正在使用这段代码:
链接模型
class Link < ActiveRecord::Base
has_many :link_items
end
Run Code Online (Sandbox Code Playgroud)
链接项目模型
class LinkItem < ActiveRecord::Base
belongs_to :link
end
class Comment < LinkItem
end
class Tag < LinkItem
end
Run Code Online (Sandbox Code Playgroud)
现在我不知道如何告诉 Rails 我的 LinkItem 模型应该是多态的。我已经阅读了有关关联的 Rails 指南和其他教程,但这些仅描述了如何创建与多个其他模型的 own_to 关联,而不是相反。
所以我的问题是:
如何创建一个 has_many 关联,其中关联的实例可以是不同类型?或者为评论、标签等创建单独的模型并将它们分别与我的链接模型相关联会更好吗?
编辑
实际上我的代码有效。
我只是尝试在我的数据库中使用“type”列(而不是“link_item_type”),rails 自动使用它来保存/确定我的 LinkItems 的正确子类(感谢 Ogz 向导的提示)
但是我仍然不能访问 LinkItem 的子类,而无需先引用 LinkItem。这是某种延迟加载吗?
首先,我正在使用:
我已经设置了一个带有多态模型的可安装 Rails 引擎,我想在其他引擎中使用它。模型类如下所示:
module Geo
class Location < ApplicationRecord
belongs_to :locatable, polymorphic: true
end
end
Run Code Online (Sandbox Code Playgroud)
在我的规范中,我想确保我有一个有效的模型,但是,在引擎中我没有与Geo::Location.
我如何设置一个虚拟类来测试有效性(belongs_to需要存在)或者您使用过哪些好的测试策略?
我正在尝试覆盖多态关系的默认序列化器。我有:
class NotificationListSerializer < ActiveModel::Serializer
attributes :id, :title
belongs_to :notifiable, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)
如果notifiable是一个组织,则使用 OrganizationSerializer 对该组织进行序列化。如果notifiable是一个 Group,则使用 GroupSerializer 序列化该组。这是完全有道理的,但是我如何根据类指定不同的序列化器?
例如,如果notifiable是一个组织,我想使用 SparseOrganizationSerializer 而不是 OrganizationSerializer。我怎样才能实现这个目标?
我很确定这已记录在案,但我很难跟踪并找到任何示例。
从文档中:
多态关系
与任何其他关联一样,多态关系是通过指定关系来序列化的。例如:
Run Code Online (Sandbox Code Playgroud)class PictureSerializer < ActiveModel::Serializer has_one :imageable end您可以通过覆盖serializer_for来指定序列化器。有关多态关系的更多上下文,请参阅每个适配器的测试。
覆盖关联序列化器查找
如果要为关联定义特定的序列化器查找,可以重写 ActiveModel::Serializer.serializer_for 方法以根据定义的条件返回序列化器类。
Run Code Online (Sandbox Code Playgroud)class MySerializer < ActiveModel::Serializer def self.serializer_for(model, options) return SparseAdminSerializer if model.class == 'Admin' super end # the rest of the serializer end
ruby-on-rails polymorphic-associations active-model-serializers
一个多态关联类似于外键或多对一的一个关系,区别在于目标可能是多种类型(在语言班,在db表)之一.
我正在移植一个数据库设计,我已经使用了几年,从PHP到Java.在旧的代码中,我已经推出了自己的ORM,由于多种原因这不是最佳的.虽然我可能会在以后开始调整内容,也许最终会自己再次实现,现在我想在我的实体类中使用现成的ORM和JPA.
现在,关于数据库布局有一点我不知道如何在JPA中表达:
我有一个存储图形Node的Edge表格(DAG,如果重要的话).每个节点可以可选地从数据库引用另一个实体.在整个图表中可以多次引用这些entites,并且还可能存在"孤立"的entites,这对于用户来说是不可访问的,但是至少保持一段时间可能是有意义的.
这些对象在继承等方面完全没有关系,但具有自然层次结构,类似于Customer-> Site-> Floor-> Room.事实上,几年前,我开始只使用指向"父"对象的外键字段.但是,这种层次结构不够灵活,并且开始崩溃.
例如,我想允许用户将文件夹中的对象分组,某些对象可以有多个"父母",并且关系也会随着时间而变化.我需要跟踪关系是如何进行的,因此图的edegs具有与它们相关的时间跨度,从何时到何时有效.
从节点到对象的链接存储在节点表的两列中,一个在外表中携带id,一个携带其名称.例如(省略了一些列):
table Node:
+--------+-------+----------+
| ixNode | ixRef | sRefType |
+--------+-------+----------+
| 1 | NULL | NULL | <-- this is what a "folder" would look like
| 2 | 17 | Source |
| 3 | 58 | Series | <-- there's seven types of related objects so far
+--------+-------+----------+
table Source (excerpt):
+----------+--------------------+
| ixSource | sName |
+----------+--------------------+
| 16 | …Run Code Online (Sandbox Code Playgroud) 我正在尝试设计一些数据库表来存储有关某些实体及其关联的应用程序的配置设置.我可以到目前为止,但已经打了一个"砖墙".我会告诉你我的意思......(不要采取以下措施:图片,作为一个文字业务问题,图片只是向你解释我的问题的一种简单方法).
标准
请记住,每个应用程序都有一个特定且独特的方式,可以配置它来显示图片.
因此很明显我们需要2个表PICTURE和APPLICATION以及一个联结表来显示MM关系,因为许多图片可以在许多应用程序中使用 - 见下文:

我用红色突出显示了"CONFIG_TABLE"栏目 - 我非常怀疑这是坏事,非常非常糟糕.它显示对于特定应用程序,这是用于存储设置的配置表.请参见下文:

所以 - 根据您正在谈论的应用程序,有非常特殊的应用程序配置应用于图片.现在假设设计被破坏,我相信它是 - 我如何设计数据库来正确建模?(希望这是有道理的)
我正在尝试创建一个系统,我的网站的用户可以在其中收藏页面.这些页面有两种类型,俱乐部或体育.所以,我有四个模型,相关联:
用户模型:
class User < ActiveRecord::Base
..
has_many :favorites
has_many :sports, :through => :favorites
has_many :clubs, :through => :favorites
..
end
Run Code Online (Sandbox Code Playgroud)
收藏夹型号:
class Favorite < ActiveRecord::Base
..
belongs_to :user
belongs_to :favoritable, :polymorphic => true
end
Run Code Online (Sandbox Code Playgroud)
俱乐部型号:
class Club < ActiveRecord::Base
..
has_many :favorites, :as => :favoritable
has_many :users, :through => :favorites
def to_param
slug
end
end
Run Code Online (Sandbox Code Playgroud)
运动模特:
class Sport < ActiveRecord::Base
..
def to_param
slug
end
..
has_many :favorites, :as => :favoritable
has_many :users, :through => :favorites
..
end
Run Code Online (Sandbox Code Playgroud)
从本质上讲,用户可以通过收藏夹进行体育或俱乐部,而收藏,体育和俱乐部之间的关联是多态的. …
model ruby-on-rails polymorphic-associations model-associations rails-admin
我们正在尝试添加多个可接受的对象,用户可以在其中收藏许多不同的对象,但不确定如何使其工作.
这是最喜欢的型号:
class Favorite < ActiveRecord::Base
# belongs_to :imageable, polymorphic: true
belongs_to :user
belongs_to :category
belongs_to :business
belongs_to :ad_channel
belongs_to :location
belongs_to :offer
end
Run Code Online (Sandbox Code Playgroud)
用户模型:
class User < ActiveRecord::Base
has_many :favorites, as: :favoritable
end
Run Code Online (Sandbox Code Playgroud)
一个可以被收藏的例子模型:
class Category < ActiveRecord::Base
has_many :sub_categories
has_many :ad_channels
has_many :offers
belongs_to :favoritable, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)
我不确定这是否设置正确,这是我们首先需要一些反馈.
其次,我们如何为用户"喜欢"某些东西?
这是我们迄今为止尝试过的失败:
@user.favorites << Category.find(1)
Run Code Online (Sandbox Code Playgroud)
编辑:这还需要一个收藏数据库表来记录事物吗?这对我们来说是一个非常新的概念.
ruby-on-rails polymorphic-associations activemodel rails-activerecord
我使用Laravel并不是新手,但这是我第一次需要/想要使用多态关系.我在Laravel.com上看到了一个例子,它说我应该将' imageable_id '用于一个名为'images'的表,在另一个例子中我看到'commentable_id'到表'comments'.
是否有创建名称的规则?
例如:我想创建一个表'类别',用于'帖子'和'设置'.在这种情况下,我应该使用'categoryable_id'作为名称吗?
我想保存不同的结果(默认和手动),每个结果都有原因.认为这将是多态关联的好地方.然而,这些模型是命名空间的,这是一个比预期更加苛刻的方法.按照指南
应用程序/模型/事件/ reason.rb
# id :integer not null, primary key
# reasons :string
# reasonable_id :integer
# reasonable_type :string
# created_at :datetime not null
# updated_at :datetime not null
#
class Event::Reason < ActiveRecord::Base
belongs_to :reasonable, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/事件/ result.rb
class Event::Result < ActiveRecord::Base
belongs_to :event
has_one :event_reason, as: :reasonable
end
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/事件/ manual_result.rb
class Event::ManualResult < ActiveRecord::Base
belongs_to :event
has_one :event_reason, as: :reasonable
end
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试做类似的事情:
Event::ManualResult.last.event_reason
Event::ManualResult Load (5.1ms) SELECT "event_manual_results".* FROM "event_manual_results" ORDER BY "event_manual_results"."id" DESC LIMIT …Run Code Online (Sandbox Code Playgroud) ruby ruby-on-rails polymorphic-associations model-associations
activemodel ×1
activerecord ×1
eloquent ×1
jpa ×1
laravel ×1
model ×1
modeling ×1
php ×1
rails-admin ×1
relationship ×1
rspec-rails ×1
ruby ×1