标签: polymorphic-associations

热切加载多态 has_many:通过 ActiveRecord 中的关联?

如何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)

这不起作用,有什么想法吗?

activerecord ruby-on-rails polymorphic-associations

5
推荐指数
1
解决办法
1426
查看次数

如何创建具有多种类型的 has_many 关联?

我有以下内容:

  • 链接模型
  • LinkItem 模型,我希望其具有以下类型
    • 一条评论
    • 一个标签
    • ...

我正在使用这段代码:

链接模型

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。这是某种延迟加载吗?

ruby-on-rails polymorphic-associations ruby-on-rails-3.1

5
推荐指数
1
解决办法
2118
查看次数

如何单独测试具有多态belongs_to 关联的模型?

首先,我正在使用:

  • 红宝石2.3.1
  • 轨道5
  • rspec-rails 3.5

我已经设置了一个带有多态模型的可安装 Rails 引擎,我想在其他引擎中使用它。模型类如下所示:

module Geo
  class Location < ApplicationRecord
    belongs_to :locatable, polymorphic: true
  end
end
Run Code Online (Sandbox Code Playgroud)

在我的规范中,我想确保我有一个有效的模型,但是,在引擎中我没有与Geo::Location.

我如何设置一个虚拟类来测试有效性(belongs_to需要存在)或者您使用过哪些好的测试策略?

polymorphic-associations rspec-rails ruby-on-rails-5

5
推荐指数
1
解决办法
3305
查看次数

Ruby on Rails:为多态关联设置特定的序列化器

我正在尝试覆盖多态关系的默认序列化器。我有:

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。我怎样才能实现这个目标?

我很确定这已记录在案,但我很难跟踪并找到任何示例。

文档中:

多态关系

与任何其他关联一样,多态关系是通过指定关系来序列化的。例如:

class PictureSerializer < ActiveModel::Serializer
  has_one :imageable
end
Run Code Online (Sandbox Code Playgroud)

您可以通过覆盖serializer_for来指定序列化器。有关多态关系的更多上下文,请参阅每个适配器的测试。

覆盖关联序列化器查找

如果要为关联定义特定的序列化器查找,可以重写 ActiveModel::Serializer.serializer_for 方法以根据定义的条件返回序列化器类。

class MySerializer < ActiveModel::Serializer
  def self.serializer_for(model, options)
    return SparseAdminSerializer if model.class == 'Admin'
    super
  end
  # the rest of the serializer
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails polymorphic-associations active-model-serializers

5
推荐指数
1
解决办法
2185
查看次数

如何在JPA中表达多态关联?

一个多态关联类似于外键或多对一的一个关系,区别在于目标可能是多种类型(在语言班,在db表)之一.

我正在移植一个数据库设计,我已经使用了几年,从PHP到Java.在旧的代码中,我已经推出了自己的ORM,由于多种原因这不是最佳的.虽然我可能会在以后开始调整内容,也许最终会自己再次实现,现在我想在我的实体类中使用现成的ORM和JPA.

现在,关于数据库布局有一点我不知道如何在JPA中表达:

我有一个存储图形NodeEdge表格(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)

database-design modeling jpa polymorphic-associations

4
推荐指数
3
解决办法
5496
查看次数

数据库架构设计 - 如何针对实体存储特定的应用程序设置

我正在尝试设计一些数据库表来存储有关某些实体及其关联的应用程序的配置设置.我可以到目前为止,但已经打了一个"砖墙".我会告诉你我的意思......(不要采取以下措施:图片,作为一个文字业务问题,图片只是向你解释我的问题的一种简单方法).

标准

  1. 我们有一些catlog的图片.
  2. 我们有几个应用程序可以使用任意数量的这些图片.
  3. 我们想要根据应用配置如何显示这些图片 .

请记住,每个应用程序都有一个特定且独特的方式,可以配置它来显示图片.

因此很明显我们需要2个表PICTURE和APPLICATION以及一个联结表来显示MM关系,因为许多图片可以在许多应用程序中使用 - 见下文:

在此输入图像描述

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

在此输入图像描述

所以 - 根据您正在谈论的应用程序,有非常特殊的应用程序配置应用于图片.现在假设设计被破坏,我相信它是 - 我如何设计数据库来正确建模?(希望这是有道理的)

database-design polymorphic-associations

4
推荐指数
1
解决办法
630
查看次数

has_many的源反射错误:通过

我正在尝试创建一个系统,我的网站的用户可以在其中收藏页面.这些页面有两种类型,俱乐部或体育.所以,我有四个模型,相关联:

用户模型:

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

4
推荐指数
1
解决办法
2505
查看次数

Rails - 多态收藏夹(用户可以喜欢不同的型号)

我们正在尝试添加多个可接受的对象,用户可以在其中收藏许多不同的对象,但不确定如何使其工作.

这是最喜欢的型号:

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

4
推荐指数
1
解决办法
1418
查看次数

在Laravel中创建多态字段名称的规则是什么?

我使用Laravel并不是新手,但这是我第一次需要/想要使用多态关系.我在Laravel.com上看到了一个例子,它说我应该将' imageable_id '用于一个名为'images'的表,在另一个例子中我看到'commentable_id'到表'comments'.

是否有创建名称的规则?

例如:我想创建一个表'类别',用于'帖子''设置'.在这种情况下,我应该使用'categoryable_id'作为名称吗?

php relationship polymorphic-associations laravel eloquent

4
推荐指数
1
解决办法
2662
查看次数

Rails与名称空间的多态关联

我想保存不同的结果(默认和手动),每个结果都有原因.认为这将是多态关联的好地方.然而,这些模型是命名空间的,这是一个比预期更加苛刻的方法.按照指南

应用程序/模型/事件/ 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

4
推荐指数
1
解决办法
536
查看次数