如何通过在两个表中映射不同的键并在列值上隐含一些逻辑来创建关联
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_id
和 couch_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
。这是连接Content
和ContentDetails
的列。
然后在你的模型中定义如下:
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'
【讨论】:
以上是关于如何通过在两个表中映射不同的键并在列值上隐含一些逻辑来创建关联的主要内容,如果未能解决你的问题,请参考以下文章