标签: polymorphic-associations

在StackOverflow克隆中,"注释"表与"问题与解答"之间应该有什么关系?

在类似的应用程序,以计算器,我建设,我想决定什么关系我的Questions,AnswersComments表应该有.

我可以拥有Questions并且Answers都由一张桌子代表Posts.

这将允许Comments有一个外键Posts.

但是,如果Questions并且Answers是单独的表,那么Comments这些表中应该有什么关系呢?

更新:尽管所选答案建议使用类表继承方法,这似乎是数据库术语中的最佳方法,但Rails ORM不支持此选项.因此,在Rails中,我的模型必须使用单表继承,并且可能如下所示:

class Post < ActiveRecord::Base  
end  

class Question < Post  
  has_many :answers, :foreign_key => :parent_id  
  has_many :comments, :foreign_key => :parent_id  
end  

class Answer < Post  
  belongs_to :question, :foreign_key => :parent_id  
  has_many :comments, :foreign_key => :parent_id  
end  

class Comment < Post  
  belongs_to :question, :foreign_key => :parent_id  
  belongs_to :answer, :foreign_key => :parent_id  
end


class CreatePosts …
Run Code Online (Sandbox Code Playgroud)

database database-design polymorphic-associations

12
推荐指数
1
解决办法
2876
查看次数

如何避免多态关联

鉴于你必须实现像社交网络中看到的那样的新闻提要,ex facebook.目前我正在使用一个具有多态关联的News类,它可以是Image,Comment,Friendship,GroupMembership等任何类型.每当创建一个Object时,也会创建新闻.它与AR(ActiveRecords)一起工作正常,但是当我切换到DM(DataMapper)或Sequel时,我会遇到麻烦,因为它们都不会直接支持多态关联并阻止它的使用.

一种解决方法是使用带有大量UNION的大型SQL子句来合并应被视为新闻的所有不同表.但这有一些缺点,特别是性能会很糟糕.

所以我想知道如何解决没有多态关联,同时仍然获得良好的性能而没有其他缺点,比如有可能在新闻中添加元数据?

ruby-on-rails polymorphic-associations

12
推荐指数
1
解决办法
2799
查看次数

Rails 3:在控制器中找到多态模型的父级?

我正在尝试找到一种优雅(标准)的方法来将多态模型的父级传递给视图.例如:

class Picture < ActiveRecord::Base
  belongs_to :imageable, :polymorphic => true
end

class Employee < ActiveRecord::Base
  has_many :pictures, :as => :imageable
end 

class Product < ActiveRecord::Base
  has_many :pictures, :as => :imageable
end
Run Code Online (Sandbox Code Playgroud)

以下方式(find_imageable)有效,但似乎"hackish".

#PictureController(已更新,包括完整列表)

class PictureController < ApplicationController
  #/employees/:id/picture/new
  #/products/:id/picture/new
  def new
    @picture = imageable.pictures.new
    respond_with [imageable, @picture]
  end

  private
  def imageable
    @imageable ||= find_imageable
  end

  def find_imageable 
    params.each do |name, value|
      if name =~ /(.+)_id$/  
        return $1.classify.constantize.find(value)  
      end  
    end  
    nil
  end
end
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

编辑

我正在做一个new动作.路径采用的形式parent_model/:id/picture/new …

polymorphic-associations ruby-on-rails-3

12
推荐指数
1
解决办法
6747
查看次数

是否可以在模型中创建条件关联?

我已经设置了一个基于角色的访问控制系统,其中包含以下模型:

  • 角色(作为STI),
    • UserRole(全局角色)
    • ProjectRole(项目特定角色)
  • 赋值(具有不同资源的多态)
  • 用户
  • 项目(作为分配的一种资源类型)

如果用户具有特定的UserRole,则只允许用户负责该项目.此Userrole名称为"负责项目",ID为2.

在用户模型中,有两个has_many关联:responsible_assignments和responsible_projects.仅当用户具有ID为2的UserRole"负责项目"时,此关联才有效.

是否可以在用户模型中为responsible_*关联创建条件关联,这是设置此类关系的常用方法吗?

解决这类问题的最佳做法是什么?

class Role < ActiveRecord::Base
  has_many :assignments
  has_many :users, :through => :assignments

class UserRole < Role

class ProjectRole < Role

class Assignment < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
  belongs_to :resource, :polymorphic => true

class User < ActiveRecord::Base
  has_many :assignments
  has_many :roles, :through => :assignments, 
                   :class_name => "UserRole"
  has_many :responsible_assignments, :class_name => "Assignment",
                                     :conditions => { :role_id => 4 }     // specific project role
  has_many :responsible_projects, :through => :responsible_assignments, 
                                 :source => …
Run Code Online (Sandbox Code Playgroud)

conditional ruby-on-rails has-many single-table-inheritance polymorphic-associations

12
推荐指数
3
解决办法
1万
查看次数

has_one through和多表继​​承的多态关联

在我目前正在rails 4.0.0beta1下开发的项目中,我需要基于用户的身份验证,其中每个用户都可以链接到一个实体.我对铁路有点新手并且遇到了一些麻烦.

该模型如下:

class User < ActiveRecord::Base
end

class Agency < ActiveRecord::Base
end

class Client < ActiveRecord::Base
  belongs_to :agency
end
Run Code Online (Sandbox Code Playgroud)

我需要的是用户能够链接到代理商或客户端,但不能同时链接到两者(这两个是我将要调用的实体).它根本没有链接,最多只有一个链接.

我首先要寻找的是如何在rails中进行Mutli-Table继承(MTI).但有些事阻止了我:

  • 它没有开箱即用
  • 对于像我这样的新手来说,MTI看起来很难实现
  • 实施解决方案的宝石似乎过时了,太复杂或不完整
  • 宝石可能会在rails4下破坏,因为它们暂时没有更新

所以我寻找另一种解决方案,我发现了多态关联.

我从昨天起就开始使用它并花了一些时间使其工作,即使在Rails多态性has_many的帮助下:通过ActiveRecord,has_many:through和多态关联

我设法从上面的问题做了例子,但是花了一段时间,我终于遇到了两个问题:

  1. 如何将用户关系转换为has_one关联,并能够"盲目"访问链接实体?
  2. 如何设置约束,以便没有用户可以拥有多个实体?
  3. 有没有更好的方法来做我想要的?

activerecord ruby-on-rails polymorphic-associations multi-table-inheritance

12
推荐指数
1
解决办法
6539
查看次数

渴望加载,具体取决于Ruby on Rails中的关联类型

我有一个多态关联(belongs_to :resource, polymorphic: true),其中resource可以有各种不同的模型.为简化问题,假设它可以是a Order或a Customer.

如果它是Order我想要预加载订单,并预加载Address.如果是客户我想预加载Customer并预加载Location.

使用这些关联的代码执行如下操作:

<%- @issues.each do |issue| -%>
<%- case issue.resource -%>
<%- when Customer -%>
<%= issue.resource.name %> <%= issue.resource.location.name %>
<%- when Order -%>
<%= issue.resource.number %> <%= issue.resource.address.details %>
<%- end -%>
Run Code Online (Sandbox Code Playgroud)

目前我的预装用途:

@issues.preload(:resource)
Run Code Online (Sandbox Code Playgroud)

但是我仍然看到加载条件关联的n加一个问题:

SELECT "addresses".* WHERE "addresses"."order_id" = ...
SELECT "locations".* WHERE "locations"."customer_id" = ...
...
Run Code Online (Sandbox Code Playgroud)

有什么好办法解决这个问题?是否可以手动预加载关联?

ruby-on-rails polymorphic-associations rails-activerecord

12
推荐指数
1
解决办法
1291
查看次数

PostgreSQL - "多态表"与3个表

我正在使用PostgreSQL 9.5(但升级可以说是9.6).

我有权限表:

CREATE TABLE public.permissions
(
  id integer NOT NULL DEFAULT nextval('permissions_id_seq'::regclass),
  item_id integer NOT NULL,
  item_type character varying NOT NULL,
  created_at timestamp without time zone NOT NULL,
  updated_at timestamp without time zone NOT NULL,
  CONSTRAINT permissions_pkey PRIMARY KEY (id)
)
-- skipping indices declaration, but they would be present
-- on item_id, item_type
Run Code Online (Sandbox Code Playgroud)

3个表用于多对多关联

-companies_permissions(+指数声明)

CREATE TABLE public.companies_permissions
(
  id integer NOT NULL DEFAULT nextval('companies_permissions_id_seq'::regclass),
  company_id integer,
  permission_id integer,
  CONSTRAINT companies_permissions_pkey PRIMARY KEY (id),
  CONSTRAINT fk_rails_462a923fa2 FOREIGN KEY …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql one-to-many polymorphic-associations

12
推荐指数
2
解决办法
1437
查看次数

ActiveRecord :: EagerLoadPolymorphicError:无法急切加载多态关联

class Transaction < ActiveRecord::Base
  belongs_to :account, :polymorphic => true
end

class Bankaccount < ActiveRecord::Base
  has_many :transactions, :as => :account
end

class Creditcard < ActiveRecord::Base
  has_many :transactions, :as => :account
end
Run Code Online (Sandbox Code Playgroud)

尝试对帐户处于活动状态的交易进行总结.

Transaction.sum(:all, :conditions => "account.status = 'active'", :include => :account)
Run Code Online (Sandbox Code Playgroud)

所以经过一些阅读后我发现了这个:原因是父模型的类型是一个列值,因此它的相应表名不能放在该查询的FROM/JOIN子句中.表名是bankaccounts和creditcards,这是否意味着它们应该是单数的?另外,account_type是一个字符串Bankaccount或Creditcard来反映模型,但它应该是tablename吗?

activerecord ruby-on-rails polymorphic-associations

11
推荐指数
1
解决办法
8826
查看次数

涉及多态关联的复杂时间序列统计聚合

好.请耐心等待,因为我需要提供大量的背景细节才能对我的问题征求合理的答案.

我有一个网站,允许您每日选股.它的工作方式是,提示您在当天面临关闭的公司之间进行选择.例如,GE与IBM.您可以选择两种类型:性能(哪种股票表现更好?)和总成交量(合并后的股票交易量是否高于或低于X?).你每天获得100美元的虚拟美元来进行选择.

最终,我们的目标是跟踪哪个用户在以下时间段内以不同类别(下文解释)的每次选择赚取最多钱:5天,15天,30天,90天,180天,1年,全部 - 时间.计算每次选择的金额非常简单.这是总赚钱(或丢失)/选秀数量.

现在,用户选择的每个公司都属于分类层次结构.通常,分类层次结构如下所示:

分部 - >主要集团 - >产业集团 - >分类 - >公司

这里有些例子:

  • 采矿 - >金属采矿 - >铁矿石 - >棕色矿石采矿 - >公司A.
  • 采矿 - >金属采矿 - >铁矿石 - >棕色矿石采矿 - >公司B.
  • 采矿 - >金属采矿 - >铁矿石 - >褐铁矿矿业 - >公司C.
  • 采矿 - >金属采矿 - >铁矿石 - >褐铁矿采矿 - >公司D.
  • 制造业 - >烟草产品 - >雪茄 - > Stogies - >公司E.
  • 制造业 - >烟草产品 - >雪茄 - > Stogies - >公司F.
  • 制造业 - >烟草产品 - >雪茄 - >小雪茄 - …

mysql sql ruby-on-rails aggregation polymorphic-associations

11
推荐指数
1
解决办法
598
查看次数

MYSQL基于列数据和表名连接表

我想知道这是否可行.

我希望根据表1的数据加入2个表.示例表1包含列食物,其数据为"热狗".

我有一张叫热狗的桌子.

是否可以像JOIN一样进行JOIN.

SELECT * FROM table1 t join t.food on id = foodid
Run Code Online (Sandbox Code Playgroud)

我知道它不起作用,但它甚至可行,是否有一个工作周围?

提前致谢.

mysql join polymorphic-associations

10
推荐指数
1
解决办法
9260
查看次数