- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试设置一种通用的相关对象网络。假设我有 4 个模型。
我希望能够做到:
book = Book.find(1)
book.relations << Tag.find(2)
book.relations << Category.find(3)
book.relations #=> [Tag#2, Category#3]
movie = Movie.find(4)
movie.relations << book
movie.relations << Tag.find(5)
movie.relations #=> [Book#1, Tag#5]
基本上我希望能够获取任何模型类(或我允许的模型类)的任意 2 个对象并声明它们是相关的。
显然我不想创建一大堆连接表。这似乎不是一个有很多直通关联,也不是一个多态关联。
这是 Rails 可以通过关联声明支持的东西,还是我应该在这里滚动我自己的逻辑?
最佳答案
从早期开始,对多态性的支持有了显着改善。您应该能够在 Rails 2.3 中通过为所有模型使用单个连接表来实现这一点——一个关系模型。
class Relation
belongs_to :owner, :polymorphic => true
belongs_to :child_item, :polymorphic => true
end
class Book
has_many :pwned_relations, :as => :owner, :class_name => 'Relation'
has_many :pwning_relations, :as => :child_item, :class_name => 'Relation'
# and so on for each type of relation
has_many :pwned_movies, :through => :pwned_relations,
:source => :child_item, :source_type => 'Movie'
has_many :pwning_movies, :through => :pwning_relations,
:source => :owner, :source_type => 'Movie'
end
这种数据结构的一个缺点是,您必须为可能相等的配对创建两个不同的角色。如果我想看我的书的所有相关电影,我必须将这些集合添加在一起:
( pwned_movies + pwning_movies ).uniq
这个问题的一个常见例子是社交网络应用程序中的“ friend ”关系。Insoshi 使用的一种解决方案是在连接模型上注册一个 after_create
回调(在本例中为 Relation
),这会创建反向关系。 after_destroy
回调同样是必要的,但是通过这种方式,以一些额外的数据库存储为代价,您可以确信您将在单个数据库查询中获得所有相关电影。
class Relation
after_create do
unless Relation.first :conditions =>
[ 'owner_id = ? and owner_type = ? and child_item_id = ? and child_item_type = ?', child_item_id, child_item_type, owner_id, owner_type ]
Relation.create :owner => child_item, :child_item => owner
end
end
end
关于ruby-on-rails - Rails 多态多对多关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/953521/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!