【发布时间】:2015-01-12 21:36:13
【问题描述】:
简短版:我需要使用自定义内部联接来查找一个表中的 id,其中两个字段在 Rails 中的两个表中都匹配,但是 Rails 内部联接对我不知道如何解决的关系做出假设。
长版:我接手了一个具有非规范化数据库的 Rails 项目。我将一些信息提取到一个新表中,现在我需要遍历每个条目并在原始表上放置一个外键,但我无法提出正确的 ActiveRecord 查询来获取信息。
在这种情况下,一个集合属于一个存储库,并且存储库可能有很多集合。
该项目最初将所有集合和存储库存储在同一个表中,如果它是存储库,则集合名称为 NULL,如果它是集合,则具有存储库名称和集合名称。我创建了一个迁移,它采用了所有唯一的存储库名称并将它们保存在存储库表中。现在我需要做的是返回集合表并根据字符串 repname 从匹配的存储库中添加 id。
我在 SQL 中有一个查询可以提取正确的数据:
ActiveRecord::Base.connection.execute("SELECT r.id, r.repname FROM collections c, repositories r WHERE c.repname = r.repname")
但是,我在与该对象交互时遇到了问题(出现诸如“#Mysql2::Result... 的未定义方法'last'之类的错误”),我希望我知道所有内容都已正确设置在Rails 模型。
当我尝试这个时,我得到一个错误:
Repository.joins(:collections).where("collections.repname = repositories.repname")
Repository Load (1.0ms) SELECT `repositories`.* FROM `repositories` INNER JOIN `collections`
ON `collections`.`repository_id` = `repositories`.`id` WHERE (collections.repname = repositories.repname)
Mysql2::Error: Unknown column 'collections.repository_id' in 'on clause': SELECT `repositories`.* FROM `repositories` INNER JOIN `collections` ON `collections`.`repository_id` = `repositories`.`id` WHERE (collections.repname = repositories.repname)
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'collections.repository_id' in 'on clause': SELECT `repositories`.* FROM `repositories` INNER JOIN `collections` ON `collections`.`repository_id` = `repositories`.`id` WHERE (collections.repname = repositories.repname)
我是 Rails 和 SQL 的新手,所以我认为我的问题实际上可能在于我如何设置模型。我使用的是数据库现有的命名约定...也许我应该改用 Rails repository_id 约定?
class Collection < ActiveRecord::Base
has_many :archive_object_collections, :foreign_key => :collid, :primary_key => :collid
has_many :archive_object, :through => :archive_object_collections
belongs_to :repository, :foreign_key => "repid"
end
class Repository < ActiveRecord::Base
has_many :collections
end
我担心切换到 repository_id 并不能解决问题,但是,因为 collections 表上还没有任何类型的 id。这就是为什么我需要运行这个查询,这样我就可以在集合表中找到并插入该信息作为外键。我在 Collections 类中尝试了没有 foreign_key 的内部连接查询,没有任何变化。
对于这个冗长而曲折的问题,我们深表歉意。有人有什么建议吗?谢谢!
【问题讨论】:
标签: sql ruby-on-rails rails-activerecord