我想这样做:

Category
--------
- id
- name

Tag
--------
- id
- tag


Campaign
--------
- id
- name
- target (either a tag *or* a category)

Is a polymorphic association the answer here? I can't seem to figure out how to use it with has_one :target, :as => :targetable.

基本上,我想要竞选.目标设置为标签或类别(或future 可能的另一个模型).

推荐答案

我不认为你需要has_one个协会,belongs_to应该是你想要的.

在这种情况下,您希望在活动表上有一个target_idtarget_type列,您可以通过t.references :target调用在rake中创建它们(其中ttable变量).

class Campaign < ActiveRecord::Base
  belongs_to :target, :polymorphic => true
end

现在,campaign可以关联到TagCategory@campaign.target将返回适当的一个.

如果目标表上有一个外键指向Campaign,则会使用has_one关联.

例如,你的桌子会有

Tag: id, tag, campaign_id

他们两人都有belongs_to :campaign人的联系.在这种情况下,必须使用has_one :taghas_one :category,但此时不能使用通用target.

这更有意义吗?

EDIT

由于target_idtarget_type实际上是另一个表的外键,所以Campaign属于其中一个.我能看出你对措辞的困惑,因为从逻辑上讲,Campaign是容器.我想你可以把它想象成Campaign有一个单一的目标,这是TagContainer,因此它属于TagContainer.

has_one表示关系是在目标类上定义的.例如,Tag应该通过has_one关系与活动关联,因为标记类上没有标识关联的内容.在这种情况下,你应该

class Tag < ActiveRecord::Base
  has_one :campaign, :as => :target
end

同样的Category分.在这里,:as关键字告诉rails哪个关联与Tag相关.Rails不知道如何预先解决这个问题,因为它与Campaign上的tag没有关联.

另外两个可能会造成进一步混淆的选项是sourcesource_type选项.这些只在:through个关系中使用,在这些关系中,您实际上加入了另一个表的关联.文档可能对其进行了更好的描述,但source定义了关联名称,source_type用于关联多态的地方.只有当目标关联(在:through类上)有一个不明显的名称时,才需要使用它们——就像上面target andTag的例子一样——我们需要告诉rails使用哪一个.

Ruby-on-rails相关问答推荐

Rails 7涡轮框架和多种形式与形式值有关

如何在嵌套路由中使用Ruby on rails多态关联

根据表单内的 Select 字段值渲染部分内容

使用嵌套属性时如何自动将父 ID 分配为外键?

Ruby:如何通过谓词将一个集合拆分为 ruby​​ 中的两个集合?

如何在 Ruby on Rails 中正确存储 BigDecimal

为什么在保存对象后使用重新加载方法? (Hartl Rails Tut 6.30)

没有要加载的文件 - readline

将 Amazon SES 与 Rails ActionMailer 结合使用

Rails - 生产模式下的错误

如何在 rspec 测试中输出变量?

批量查找 mongoDB 记录(使用 mongoid ruby​​ 适配器)

Ruby on Rails 中的MySQL 服务器已经消失

Ruby 和 Ruby on Rails 离线 API 文档

Rails,设计认证,CSRF 问题

强参数需要多个

Rails:如何将日期时间字符串解析为特定时区

使用 Rspec 测试关联的正确方法?

如何在 Rails 表单中将复选框和标签保持在同一行?

Ruby 中的类别名