当前位置: 首页 > 面试题库 >

在Rails 3中具有继承关系的命名作用域映射到错误的表

靳举
2023-03-14
问题内容

我正在尝试使用具有命名作用域的类的继承:

Class A < ActiveRecord::Base
    scope :useful_scope, lambda { |value1, value2|
        where(:value1 => value1, :value2 => value2)
    end
end

Class B < A
    set_table_name "b"
end

我遇到的问题是sql查询中的表名仍引用A类表:

A.useful_scope("alpha", "beta").to_sql
 => "SELECT \"a\".* FROM \"a\" WHERE \"a\".\"value1\" = 'alpha' AND \"a\".\"value2\" = 'beta'"
B.useful_scope("alpha", "beta").to_sql
 => "SELECT \"b\".* FROM \"b\" WHERE \"a\".\"value1\" = 'alpha' AND \"a\".\"value2\" = 'beta'"

请注意,WHERE语句中的表名仍然引用A。我正在修改一个现有的gem,它在整个A类范围内具有各种依赖性,因此我需要保持其当前语法。我想在WHERE子句SQL中维护表名称说明符,以确保在与其他命名作用域定义嵌套时作用域表现良好。

我尝试了以下方法:

  • 使用lambda参数作为表名。这破坏了其他仅提供当前2个属性的范围的引用的语法。
  • 使用抽象类定义范围。表名的绑定相同,但使用的是Abstract Class的类名。
  • 使用模块中定义的范围并包括该模块。表名称的绑定相同。

有没有一种方法可以强制在每个继承的类上对范围进行评估,以便不将其显式映射到父类表?


问题答案:

我最终使用了匿名作用域来解决此问题。代码如下:

def self.useful_scope(value1, value2)
  scoped(:conditions => { :value1 => value1, :value2 => value2 })
end

现在,这将在父类和继承的类中正确评估,并保留所需的作用域行为。



 类似资料:
  • 我有一个BaseEntity,当我像这样制作mapper时,它有一个名为Customer的子级: Mapstruct不会自动映射BaseEntity字段。你能告诉我怎么做吗?

  • 我有一个用JPA映射的简单类: 我把那门课扩展成了非常简单的课 这正是我对SponsorDefainableBo所需要的。它是Sponsor的副本,并且从与Sponsor相同的表中读取。这是我们通过一些xml文档控制的查询框架所需要的,并且需要成为我正在做的事情的单独对象。需要SponsorDefainableBo插入查询/维护框架以进行我们不想在主父文档中进行的自定义详细信息。当我尝试使用Spo

  • 我的域名: 我的DTO: 我的地图绘制程序如下所示: 但是,我得到了以下错误: 目标名称“Framework.system”的类型Framework中的未知属性“system”。你是说“框架外部化”吗?目标名称为“Framework.availability”的Framework类型中的未知属性“availability”。你是说“框架外部化”吗?

  • 1. 前言 本节课程和大家一起学习继承映射。通过本节课程的学习,你将了解到: 什么是继承映射; 实现继承映射的 3 种方案。 2. 继承映射 学习继承映射之前,需要搞清楚什么是继承映射? 继承是 OOP 中的概念,其目的除了复用代码之外,还用来描述对象在现实世界中的关系。 为了更好地讲解继承映射,咱们再在数据库中创建一张老师表。数据库中多了一张表,按照使用 Hibernate 的套路,理所当然应该

  • 问题内容: 目前,我有这样的结构: 它使用联接表与每个子类一个表映射。由于历史原因,我也使用了一个鉴别器,因此当前情况如《 Hibernate手册》第9.1.3节所述 。 问题: 如何为这样的结构扩展映射: 我可以在hibernate映射中吗?什么我需要S’ 问题答案: 未测试, 但根据发布的链接(如果您使用的是hibernate3)

  • 问题内容: 我正在寻找一种奇妙的方式来防止闭合继承周围的scrope。例如: 我知道只有 两种方法可以 防止共享范围: (1)使用阴影变量: (2)将函数体放在其他位置: 我的问题是-有人知道防止闭包继承JS范围的第三种方法吗?花哨的东西很好。 我认为唯一可行的方法是在Node.js中。 让我们利用想象力来思考一下,并假设JS有一个private关键字,这意味着变量仅在该函数的作用域内是私有的,如