在Rails中定义两个模型之间的多个(相似)关系

格兰特·尼尔森

我一直在尝试在SO上排列其他(非常)类似的答案,但是还没有点击一下,我觉得我已经接近了。

我想通过两种不同的方式将用户模型与类别模型相关联,具体取决于用户希望每个类别使用哪种通知渠道(文本或电子邮件)。用户可以有许多类别,反之亦然。

期望的结果:

>>@user.textcategories=>#<ActiveRecord::Associations::CollectionProxy []>类别。

>> @user.emailcategories=>#<ActiveRecord::Associations::CollectionProxy []>类别。

>> @user.emailcategories << Category.first

>> @user.textcategories << Category.third ETC。

当前代码:

class User < ActiveRecord::Base
  has_many :emailcategories 
  has_many :categories, through: :emailcategories

  has_many :textcategories
  has_many :categories, through: :textcategories
end

class Category < ActiveRecord::Base
  has_many :emailcategories 
  has_many :users, through: :emailcategories

  has_many :textcategories 
  has_many :users, through: :textcategories
end

class Emailcategory < ActiveRecord::Base
  belongs_to :user
  belongs_to :category
end

class Textcategory < ActiveRecord::Base
  belongs_to :user
  belongs_to :category
end

迁移/方案:

create_table "emailcategories" do |t|
      t.integer :user_id
      t.integer :category_id
      t.datetime "created_at",       null: false
      t.datetime "updated_at",       null: false
    end

    create_table "textcategories" do |t|
      t.integer :user_id
      t.integer :category_id
      t.datetime "created_at",       null: false
      t.datetime "updated_at",       null: false
    end

    create_table :users do |t|
      t.string :name
    end

    create_table :categories do |t|
      t.string :name
    end

当前错误消息:>> @user.emailcategories << Category.firstActiveRecord :: AssociationTypeMismatch:预期为Emailcategory(#70239513207200),得到了Category(#70239513077640)

Github克隆并尝试:https : //github.com/Grantimus9/TestRels

谢谢!

扎克·施耐德(Zach Schneider)

对于您现有的代码,以上答案是正确的。但是,如果要使用<<语法,则应在联接表上使用STI。(尽管这可能是个人喜好,但我也认为这是一种较干净的解决方案。)

# db/schema.rb
create_table "categories", force: :cascade do |t|
  t.string   "name"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "category_users", force: :cascade do |t|
  t.integer  "category_id"
  t.integer  "user_id"
  t.string   "type"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
end

create_table "users", force: :cascade do |t|
  t.string   "name"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

# app/models/user.rb
class User < ActiveRecord::Base
  has_many :email_category_users
  has_many :email_categories, through: :email_category_users, source: :category
  has_many :text_category_users
  has_many :text_categories, through: :text_category_users, source: :category

  # If you also need to get all categories on a user
  has_many :category_users
  has_many :categories, through: :category_users
end

# app/models/category_user.rb
class CategoryUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :category
end

# app/models/email_category_user.rb
class EmailCategoryUser < CategoryUser
end

# app/models/text_category_user.rb
class TextCategoryUser < CategoryUser
end

# app/models/category.rb
class Category < ActiveRecord::Base
  has_many :category_users 
  has_many :users, through: :category_users
end

该解决方案使您可以使用OP中概述的所有语法来创建/访问类别(尽管有此类@user.text_categories,请注意下划线)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rails:两个模型之间的多重关系

来自分类Dev

两个相似定义之间的差异

来自分类Dev

Rails:两个模型之间的两种不同的多对多关系

来自分类Dev

MongoDB / mongoose在两个模型之间创建关系?

来自分类Dev

在两个现有模型之间建立关系的导轨

来自分类Dev

Yii-通过以下两个模型定义关系

来自分类Dev

列表中两个词之间的余弦相似度

来自分类Dev

如何在Rails中合并具有一对多关系的两个模型?

来自分类Dev

实体框架:处理两个实体之间的多个关系

来自分类Dev

两个或多个ID之间的多重关系?

来自分类Dev

无法定义两个对象之间的关系

来自分类Dev

当两个类之间具有多个不同的(一对多,多对多)关系时,如何注释模型类

来自分类Dev

我如何在两个模型之间具有多个has_many到has_many关系?

来自分类Dev

Rails:在命名空间中的两个模型之间创建多对多关系,我需要做什么?

来自分类Dev

Rails 4-两个模型之间的关联

来自分类Dev

两个模型之间有不同的关联Rails

来自分类Dev

在 Rails 中的两个或更多模型之间的索引处显示数据

来自分类Dev

多对一关系:两个模型中的访问

来自分类Dev

Rails模型中2个表之间的关系如何?

来自分类Dev

Rails中的3个模型之间的关系(老师,受试者,学生)

来自分类Dev

Java中两个列表之间的关系

来自分类Dev

缓存中两个项目之间的缓存依赖关系

来自分类Dev

MVC中两个下拉列表之间的关系

来自分类Dev

Laravel 中两个表之间的关系错误

来自分类Dev

定义多个模型之间的关系-Django

来自分类Dev

Django-模型-如何描述两个模型之间的特定双向关系?

来自分类Dev

Laravel 模型在两个表之间创建两次关系

来自分类Dev

XSLT-1.0 如何在两个相似标签之间选择多个标签?

来自分类Dev

SQL父子查询-关系在两个表中定义

Related 相关文章

  1. 1

    Rails:两个模型之间的多重关系

  2. 2

    两个相似定义之间的差异

  3. 3

    Rails:两个模型之间的两种不同的多对多关系

  4. 4

    MongoDB / mongoose在两个模型之间创建关系?

  5. 5

    在两个现有模型之间建立关系的导轨

  6. 6

    Yii-通过以下两个模型定义关系

  7. 7

    列表中两个词之间的余弦相似度

  8. 8

    如何在Rails中合并具有一对多关系的两个模型?

  9. 9

    实体框架:处理两个实体之间的多个关系

  10. 10

    两个或多个ID之间的多重关系?

  11. 11

    无法定义两个对象之间的关系

  12. 12

    当两个类之间具有多个不同的(一对多,多对多)关系时,如何注释模型类

  13. 13

    我如何在两个模型之间具有多个has_many到has_many关系?

  14. 14

    Rails:在命名空间中的两个模型之间创建多对多关系,我需要做什么?

  15. 15

    Rails 4-两个模型之间的关联

  16. 16

    两个模型之间有不同的关联Rails

  17. 17

    在 Rails 中的两个或更多模型之间的索引处显示数据

  18. 18

    多对一关系:两个模型中的访问

  19. 19

    Rails模型中2个表之间的关系如何?

  20. 20

    Rails中的3个模型之间的关系(老师,受试者,学生)

  21. 21

    Java中两个列表之间的关系

  22. 22

    缓存中两个项目之间的缓存依赖关系

  23. 23

    MVC中两个下拉列表之间的关系

  24. 24

    Laravel 中两个表之间的关系错误

  25. 25

    定义多个模型之间的关系-Django

  26. 26

    Django-模型-如何描述两个模型之间的特定双向关系?

  27. 27

    Laravel 模型在两个表之间创建两次关系

  28. 28

    XSLT-1.0 如何在两个相似标签之间选择多个标签?

  29. 29

    SQL父子查询-关系在两个表中定义

热门标签

归档