在类似的应用程序,以计算器,我建设,我想决定什么关系我的Questions,Answers和Comments表应该有.
我可以拥有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) 鉴于你必须实现像社交网络中看到的那样的新闻提要,ex facebook.目前我正在使用一个具有多态关联的News类,它可以是Image,Comment,Friendship,GroupMembership等任何类型.每当创建一个Object时,也会创建新闻.它与AR(ActiveRecords)一起工作正常,但是当我切换到DM(DataMapper)或Sequel时,我会遇到麻烦,因为它们都不会直接支持多态关联并阻止它的使用.
一种解决方法是使用带有大量UNION的大型SQL子句来合并应被视为新闻的所有不同表.但这有一些缺点,特别是性能会很糟糕.
所以我想知道如何解决没有多态关联,同时仍然获得良好的性能而没有其他缺点,比如有可能在新闻中添加元数据?
我正在尝试找到一种优雅(标准)的方法来将多态模型的父级传递给视图.例如:
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".
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 …
我已经设置了一个基于角色的访问控制系统,其中包含以下模型:
如果用户具有特定的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
在我目前正在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).但有些事阻止了我:
所以我寻找另一种解决方案,我发现了多态关联.
我从昨天起就开始使用它并花了一些时间使其工作,即使在Rails多态性has_many的帮助下:通过和ActiveRecord,has_many:through和多态关联
我设法从上面的问题做了例子,但是花了一段时间,我终于遇到了两个问题:
activerecord ruby-on-rails polymorphic-associations multi-table-inheritance
我有一个多态关联(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)
有什么好办法解决这个问题?是否可以手动预加载关联?
我正在使用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
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吗?
好.请耐心等待,因为我需要提供大量的背景细节才能对我的问题征求合理的答案.
我有一个网站,允许您每日选股.它的工作方式是,提示您在当天面临关闭的公司之间进行选择.例如,GE与IBM.您可以选择两种类型:性能(哪种股票表现更好?)和总成交量(合并后的股票交易量是否高于或低于X?).你每天获得100美元的虚拟美元来进行选择.
最终,我们的目标是跟踪哪个用户在以下时间段内以不同类别(下文解释)的每次选择赚取最多钱:5天,15天,30天,90天,180天,1年,全部 - 时间.计算每次选择的金额非常简单.这是总赚钱(或丢失)/选秀数量.
现在,用户选择的每个公司都属于分类层次结构.通常,分类层次结构如下所示:
分部 - >主要集团 - >产业集团 - >分类 - >公司
这里有些例子:
mysql sql ruby-on-rails aggregation polymorphic-associations
我想知道这是否可行.
我希望根据表1的数据加入2个表.示例表1包含列食物,其数据为"热狗".
我有一张叫热狗的桌子.
是否可以像JOIN一样进行JOIN.
SELECT * FROM table1 t join t.food on id = foodid
Run Code Online (Sandbox Code Playgroud)
我知道它不起作用,但它甚至可行,是否有一个工作周围?
提前致谢.
activerecord ×2
database ×2
mysql ×2
sql ×2
aggregation ×1
conditional ×1
has-many ×1
join ×1
one-to-many ×1
postgresql ×1