我有一种情况,我有两个模型,公司和权限,其中公司在我的权限数据库的单独数据库中.这是一个拥有并且属于许多关系,因为每个公司可以拥有许多权限,每个权限可以属于许多公司.
拆分两个数据库的原因是公司数据库运行高需求生产应用程序,权限数据库控制另一个应用程序的权限.
使用rails,它会在与主表相同的数据库中查找连接表.例如,如果我执行company.permissions,它会在公司数据库中查找company_permissions.如果我允许.它会在权限数据库中查找.
使用has的最佳解决方案是什么,属于多个数据库的多种关系?
一般混乱
我有乐队可以有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表".
我不期待铁路为我处理所有肮脏的工作,但我确实想按照规则行事.
我有以下两个模型: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)
我究竟做错了什么 ?
我正在自学Rails,作为一个测试项目,我正在嘲笑一个类似于stackoverflow的简单问题/答案应用程序.
在我的简化版本中,我有:
在我看来,问题和答案并不真正"归于"用户,而是问题和答案"has_one user"(作者).但这似乎也不正确,因为那时用户将"属于问题"和"属于回答".
HABTM是三个班级之间的答案吗?
很多人都被这种关系困住了,不是吗?:)
ruby-on-rails foreign-key-relationship 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.
赏金:
+500代表赏金的解决方案.我已经严重撞击这堵墙了两个星期了,我已准备好帮忙了.
表/模型(简化为显示关联)
大概的概念:
用户可以创建节点类型(例如"电视台","电视节目"和"演员"......任何东西).如果我提前知道节点类型是什么以及每个节点之间的关联,我只是为它们制作模型 - 但我希望这是非常开放的,以便用户可以创建他们想要的任何节点类型.然后,(特定节点类型的)每个节点可以与任何其他节点类型的任何其他节点相关.
描述和我尝试过的内容:
每个节点都应该能够与任何/每个其他节点相关联.
我的假设是,要做到这一点,我必须有一个关联表 - 所以我做了一个名为"node_associations",其中包含node_id和other_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
在我的应用程序中,用户可以关注许多用户,并且可以跟随许多用户.我尝试使用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.我错过了什么吗?
我有一个使用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
我有一个如下模型设置:
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
我在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
fixtures ×2
activerecord ×1
arel ×1
associations ×1
cakephp ×1
cakephp-2.1 ×1
database ×1
ember-data ×1
ember.js ×1
factories ×1
foreign-keys ×1
join ×1
migration ×1
ransack ×1
ruby ×1
scope ×1