如何通过在两个表中映射不同的键并在列值上隐含一些逻辑来创建关联

Posted

技术标签:

【中文标题】如何通过在两个表中映射不同的键并在列值上隐含一些逻辑来创建关联【英文标题】:How to create an association with mapping different keys in two table and implying some logic on the column values 【发布时间】:2016-03-29 02:25:55 【问题描述】:

我有两张桌子

内容(主键:id,another_column:module_couch_id:string)

ContentDetails(主键:id,another_column:couch_id:string)

例如:

module_couch_id => 'say_hello_to_the_world'

couch_id => 'system.content.say_hello_to_the_world.en.us.192'

我如何在 Content 类中定义一个关联以便我可以做到这一点

Content.first.content_details & 从第二个检索数据

【问题讨论】:

Content 模型中定义content_details 方法,例如:def content_details ContentDetails.map|cd| return cd if cd.couch_id.include? self.module_couch_id end 现在,当您运行Content.first.content_details 时,它将返回您需要的记录。 很好,但是如果我做一个Content.all & 然后尝试为每个content 迭代单个ContentDetails 这将导致n+1 查询问题,我正在尝试建立一个关联,以便我可以急切地加载它 我们可以在 Content Model 中执行此操作:has_many :content_details, :foreign_key => :couch_id 但您的 module_couch_idcouch_id 具有不同的值,需要应用 include? 方法来检查 couch_id 是否有子字符串 module_couch_id。 是的,这就是我想我正在寻找的关于如何使用 has_many 块指定 includes? 条件的内容, 这应该可以工作:has_many :content_details, -> (object) where("couch_id like ?", "%#object.module_couch_id%") , :foreign_key => 'couch_id' 【参考方案1】:

您需要在ContentDetails 表中添加integer 类型的列content_id。这是连接ContentContentDetails 的列。

然后在你的模型中定义如下:

class Content < ActiveRecord::Base
  has_many :content_details
end

class ContentDetail < ActiveRecord::Base
  belongs_to :content
end

你应该能够:

Content.first.content_details

【讨论】:

是的,我知道,但我没有对表的写访问权限,因此关联需要驻留在 module_couch_id 和 couch_id 字段上,因此关于如何编写没有 content_id 的关联的问题字段,但两个表中的 couch_id 字段【参考方案2】:

这种方法应该有效:

has_many :content_details, -> (object)  where("couch_id like ?", "%#object.module_couch_id%") , :foreign_key => 'couch_id'

【讨论】:

以上是关于如何通过在两个表中映射不同的键并在列值上隐含一些逻辑来创建关联的主要内容,如果未能解决你的问题,请参考以下文章

JoinColumns 在列和静态值上

如何下载 csv 中的 URL 并根据列值命名输出

如何基于查找数据框创建数据框并在特定列中的动态和映射值上创建多列

如何更新重复列值上的 mySQL 键

如何优化 SQL 查询以检查表中列值的一致性

如何在哈希表中均匀分布不同的键?