标签: has-and-belongs-to-many

拥有并且属于与多个数据库的许多关系

我有一种情况,我有两个模型,公司和权限,其中公司在我的权限数据库的单独数据库中.这是一个拥有并且属于许多关系,因为每个公司可以拥有许多权限,每个权限可以属于许多公司.

拆分两个数据库的原因是公司数据库运行高需求生产应用程序,权限数据库控制另一个应用程序的权限.

使用rails,它会在与主表相同的数据库中查找连接表.例如,如果我执行company.permissions,它会在公司数据库中查找company_permissions.如果我允许.它会在权限数据库中查找.

使用has的最佳解决方案是什么,属于多个数据库的多种关系?

ruby database ruby-on-rails has-and-belongs-to-many

7
推荐指数
2
解决办法
5249
查看次数

Rails has_and_belongs_to_many让我对固定装置和工厂感到困惑

一般混乱
我有乐队可以有3种类型.我在之前的SO文章中读到,处理这个问题的正确方法是几个步骤:

1)在band.rb

has_and_belongs_to_many :genres
Run Code Online (Sandbox Code Playgroud)

2)创建band_genres连接表

即使阅读了文档后,我对HABTM的实际含义感到有些困惑.我想我通常会认为"一个乐队有很多类型",没有并且属于很多.因此,对此的快速DUMBED解释将是伟大的.

与夹具混淆

另外,当我为band_genres做夹具时,我有

{ 
  "The Reaper Band and Funk": { "band": "The Reaper Band", "genre": "Funk" },
  "The Reaper Band and Rock": { "band": "The Reaper Band", "genre": "Rock" }  
}
Run Code Online (Sandbox Code Playgroud)

我得到了一个"未知"的乐队专栏.我认为rails应该知道"The Reaper Band"会指一个乐队乐队的乐队(当然是同名)并且会抓住那个id并且知道这个乐器中的"band"会引用连接表中的band_id .我宁愿我的灯具看起来像硬编码的数字.

与工厂混淆

当我在工厂创建一个乐队时,我想指定它的类型:

Factory.define :band do |f|
  f.sequence(:name) { |n| "Band#{n}" }
  f.mailing_lists { |mailing_lists| [mailing_lists.association(:mailing_list)] }
  f.genres 2
end
Run Code Online (Sandbox Code Playgroud)

我在这里意识到我可能需要一个硬编码的genre_id.但是为什么rails不看那个并说"哦,他想把id = 2的类型添加到band_genres表".

我不期待铁路为我处理所有肮脏的工作,但我确实想按照规则行事.

ruby-on-rails fixtures has-and-belongs-to-many factories

7
推荐指数
1
解决办法
4221
查看次数

如何在我的灯具中加载HABTM与外键关系?

我有以下两个模型:School和User,以及它们之间的HABTM关系,带有连接表.

在这个连接表的外键指的用户表中不叫user_id,但student_id.

class School < ActiveRecord::Base
 has_and_belongs_to_many :students, :class_name => "User", :join_table => "schools_students", :foreign_key => "student_id"
end

class User < ActiveRecord::Base
 has_and_belongs_to_many :studying_schools, :class_name => "School", :join_table => "schools_students", :foreign_key => "school_id"
end
Run Code Online (Sandbox Code Playgroud)

我想在我的用户和学校设备中创建一个学校和一个用户,但在User中定义的foreign_key似乎是个问题.

fixtures/users.yml :

user1:
  name: Student
  studying_schools: school1
Run Code Online (Sandbox Code Playgroud)

fixtures/schools.yml :

school1:
  name: School 1
  active: true
  students: user1
Run Code Online (Sandbox Code Playgroud)

加载上面的灯具会返回ActiveRecord异常: ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'user_id' in 'field list': INSERT INTO schools_students (student_id, user_id) VALUES (6562055, 14302562)

我究竟做错了什么 ?

ruby-on-rails foreign-keys fixtures has-and-belongs-to-many

7
推荐指数
1
解决办法
6565
查看次数

HABTM,还是多个belongs_to?

我正在自学Rails,作为一个测试项目,我正在嘲笑一个类似于stackoverflow的简单问题/答案应用程序.

在我的简化版本中,我有:

  • 问题
  • 答案
  • 用户(问答的作者)
我得到答案属于问题.

  • 用户和问题之间的正确关系是什么?
  • 用户和答案之间的正确关系是什么?

在我看来,问题和答案并不真正"归于"用户,而是问题和答案"has_one user"(作者).但这似乎也不正确,因为那时用户将"属于问题"和"属于回答".

HABTM是三个班级之间的答案吗?

很多人都被这种关系困住了,不是吗?:)

ruby-on-rails foreign-key-relationship has-and-belongs-to-many

7
推荐指数
1
解决办法
852
查看次数

如何与Ember.js和ember-data创建has_and_belongs_to_many关系?

是否可以与Ember.js和ember-data创建hasAndBelongsToMany关系?

编辑:添加ActiveRecord模型示例以澄清.

class Project < ActiveRecord::Base
  has_and_belongs_to_many :tags
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :projects
end
Run Code Online (Sandbox Code Playgroud)

我有一个关联表"projects_tags"链接project_id <=> tag_id.

ruby-on-rails has-and-belongs-to-many ember.js ember-data

7
推荐指数
1
解决办法
1882
查看次数

自我"HABTM"或"HasMany Through"概念混乱

赏金:

+500代表赏金的解决方案.我已经严重撞击这堵墙了两个星期了,我已准备好帮忙了.

表/模型(简化为显示关联)

  • 节点
    • ID
    • 名称
    • node_type_id
  • node_associations
    • ID
    • NODE_ID
    • other_node_id
  • node_types
    • ID
    • 名称

大概的概念:

用户可以创建节点类型(例如"电视台","电视节目"和"演员"......任何东西).如果我提前知道节点类型是什么以及每个节点之间的关联,我只是为它们制作模型 - 但我希望这是非常开放的,以便用户可以创建他们想要的任何节点类型.然后,(特定节点类型的)每个节点可以与任何其他节点类型的任何其他节点相关.

描述和我尝试过的内容:

每个节点都应该能够与任何/每个其他节点相关联.

我的假设是,要做到这一点,我必须有一个关联表 - 所以我做了一个名为"node_associations",其中包含node_idother_node_id.

然后我建立了我的关联(通过我相信使用hasMany):(以下是我对我的设置的最好记忆......它可能稍微关闭)

//Node model
public $hasMany = array(
    'Node' => array(
        'className' => 'NodeAssociation',
        'foreignKey' => 'node_id'

    ),
    'OtherNode' => array(
        'className' => 'NodeAssociation',
        'foreignKey' => 'other_node_id'
    )
);

//NodeAssociation model
public $belongsTo = array(
    'Node' => array(
        'className' => 'Node',
        'foreignKey' => 'node_id'

    ),
    'OtherNode' => array(
        'className' => 'Node',
        'foreignKey' => 'other_node_id' …
Run Code Online (Sandbox Code Playgroud)

cakephp associations has-and-belongs-to-many has-many-through cakephp-2.1

7
推荐指数
1
解决办法
982
查看次数

Rails HABTM自连接错误

在我的应用程序中,用户可以关注许多用户,并且可以跟随许多用户.我尝试使用has_and_belongs_to_many关联对此进行建模

class User < ActiveRecord::Base
  has_and_belongs_to_many :followers, class_name: "User", foreign_key: "followee_id", join_table: "followees_followers"
  has_and_belongs_to_many :followees, class_name: "User", foreign_key: "follower_id", join_table: "followees_followers"
end
Run Code Online (Sandbox Code Playgroud)

另外,我为join表创建了一个迁移,如下所示:

class FolloweesFollowers < ActiveRecord::Migration
  def up
    create_table 'followees_followers', :id => false do |t|
        t.column :followee_id, :integer
        t.column :follower_id, :integer
    end
  end

  def down
    drop_table 'followees_followers'
  end
end
Run Code Online (Sandbox Code Playgroud)

当我尝试访问用户的关注者(User.first.followers)时,它会抛出一个错误:

SQLException: no such column: followees_followers.user_id: SELECT "users".* FROM "users" INNER JOIN "followees_followers" ON "users"."id" = "followees_followers"."user_id" WHERE "followees_followers"."followee_id" = 1
Run Code Online (Sandbox Code Playgroud)

我不明白为什么要访问followees_followers.user_id.我错过了什么吗?

has-and-belongs-to-many ruby-on-rails-3

7
推荐指数
1
解决办法
1370
查看次数

Ransack和act-as-taggable-on问题

我有一个使用act-as-taggable-on的几个分类法的模型

class Film < ActiveRecord::Base
  attr_accessible :mood_list, :genre_list, :tag_list, :country_list
  acts_as_taggable_on :countries, :genres, :moods, :tags
end
Run Code Online (Sandbox Code Playgroud)

我试图让Ransack搜索找到有任何心情和完全匹配国家的记录.但它返回了0条记录,而我有匹配的记录,请参阅:

Film.search({:moods_name_in=>['happy', 'snooze']}).result.count => 2    
Film.search({:countries_name_eq=>'USA'}).result.count => 2
Film.search({:moods_name_in=>['happy', 'snooze'], :countries_name_eq=>'USA'}).result.count => 0
Run Code Online (Sandbox Code Playgroud)

它什么都没有!但我肯定有一个:

>> f.countries
[#<ActsAsTaggableOn::Tag id: 13, name: "USA">]
>> f.moods
[#<ActsAsTaggableOn::Tag id: 17, name: "active">, #<ActsAsTaggableOn::Tag id: 16, name: "psyched">, #<ActsAsTaggableOn::Tag id: 15, name: "happy">]
The SQL generated is:
(3.2ms)  SELECT COUNT(DISTINCT "films"."id") FROM "films" LEFT OUTER JOIN "taggings" ON "taggings"."taggable_id" = "films"."id" AND taggings.context = ('moods') AND "taggings"."taggable_type" = 'Film' …
Run Code Online (Sandbox Code Playgroud)

activerecord has-and-belongs-to-many acts-as-taggable-on arel ransack

7
推荐指数
1
解决办法
1237
查看次数

连接表上的Default_scope

我有一个如下模型设置:

class User
  has_many :items
  has_many :words, :through => :items
end

class Item
  belongs_to :user
  belongs_to :word

  default_scope where(:active => true)
end

class Words
  has_many :items
end
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是default_scope没有应用于以下关联:

 user.words
Run Code Online (Sandbox Code Playgroud)

而不是这个SQL:

SELECT `words`.* FROM `words` INNER JOIN `items` ON `words`.id = `items`.word_id WHERE ((`items`.user_id = 1)) AND ((`items.active = 1))
Run Code Online (Sandbox Code Playgroud)

我在日志中得到这个SQL:

SELECT `words`.* FROM `words` INNER JOIN `items` ON `words`.id = `items`.word_id WHERE ((`items`.user_id = 1)) 
Run Code Online (Sandbox Code Playgroud)

我认为这是因为默认范围适用于常规模型及其子关联,但不适用于连接表.

使连接表范围在关联之间工作而不需要指定它的正确Rails方法是什么?有人存在吗?

scope ruby-on-rails has-and-belongs-to-many has-many-through default-scope

6
推荐指数
1
解决办法
2281
查看次数

在rails 4迁移中加入表注释

我在rails 4上很新,我不确定应该如何成为我的join_table.

我完成了迁移

rails g migration CreateJoinTableQuestionSubTopic question sub_topic
Run Code Online (Sandbox Code Playgroud)

我收到这个文件

class CreateJoinTableQuestionSubTopic < ActiveRecord::Migration
  def change
    create_join_table :questions, :sub_topics do |t|
      # t.index [:question_id, :sub_topic_id]
      # t.index [:sub_topic_id, :question_id]
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

为什么这两个索引都在评论中?我认为其中只有一个取消注释,这是正确的方法吗?

没有必要写

t.column :question_id, :integer
t.column :sub_topic_id, :integer
Run Code Online (Sandbox Code Playgroud)

和/或

t.index :question_id
t.index :sub_topic_id
Run Code Online (Sandbox Code Playgroud)

我想有一个高性能的连接表,但如果在rails 4上有一个新表,我不想以旧时尚方式进行

谢谢你的帮助

migration join ruby-on-rails has-and-belongs-to-many ruby-on-rails-4

6
推荐指数
1
解决办法
550
查看次数