Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将实例方法转换为关联?

如何将实例方法转换为关联?
EN

Stack Overflow用户
提问于 2021-09-23 06:55:19
回答 2查看 81关注 0票数 0

Subscription has_many :versions模型

我正在编写一个查询,以获取订阅并按照关联的versions最后一个authorized_at日期对它们进行排序,但由于joinsgroup语句,我不确定查询能否多次返回相同的订阅。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Subscription
      .joins(:versions)
      .group("subscriptions.id, users.id")
      .order("MAX(versions.authorized_at) ASC")

另一方面,我有一个Subscription实例方法current_version,它返回最后一个授权的version

subscription.rb

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def current_version
    versions.authorized.last
  end

我认为关联(而不是实例方法)可以帮助我,因此我可以加入订阅表和版本表,并按照关联的表授权日期对结果进行排序。

但是,如何像类方法那样编写执行查询的关联呢?

,我试过做了如下的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
has_one     :current_version,
              -> { versions.authorized.last },
              class_name: "Version", inverse_of: "Subscription"

但我得到了NameError: undefined local variable or method 'versions' for #<Version::ActiveRecord_Relation

EN

回答 2

Stack Overflow用户

发布于 2021-09-23 09:47:27

读取性能的最佳解决方案是将一个单独的外键列作为捷径添加到表中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_reference :subscriptions, 
              :current_version,
              foreign_key: {
                to_table: :versions  ​
             ​}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Subscription < ApplicationRecord
  has_many :versions, 
    after_add: :set_current_version
  belongs_to :current_version,
    class_name: 'Version'

  def set_current_version(version)
     update_attribute(:current_version_id, version.id) 
  end
end

这将使用一组位置回调来设置关联,但也可以使用DB触发器或服务对象来处理它。

如果你真的想使用has_one,你需要像子查询一样使用黑客,窗口函数或后置连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Subscription
  has_one :current_version, 
    -> {
      where(
        id: Version.select(:id)
                   .group(:subscription_id)
                   .order("MAX(versions.authorized_at) ASC")
      )
    },
    class_name: 'Version'
end
票数 1
EN

Stack Overflow用户

发布于 2021-09-24 03:42:13

我通过max尝试了上面的答案,它在控制台中工作(我只尝试了has_one的提议),但是我无法使视图正常工作(我一直得到未定义的表错误)。

最后,我创建了一个使用它的current_version (上一次授权version)获取订阅的范围,并使用了该范围。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  scope :with_current_version, -> {
    select("subscriptions.*, last_version.authorized_at AS last_version_authorized_at")
      .joins("LEFT OUTER JOIN (SELECT DISTINCT ON (subscription_id) * FROM versions
      ORDER BY versions.subscription_id,
      versions.authorized_at DESC) AS last_version
      ON last_version.subscription_id = subscriptions.id")
  }

然后在我的控制器里:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@subscriptions = current_account.subscriptions.with_current_version
                         .order("last_version_authorized_at ASC")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69302391

复制
相关文章
根据用户输入的行数,打印出相应行数的直角三角形
代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>输出指定行数的* 形成直角三角形</title> </head> <body> <script> // 输出指定行数的* ,形成直角三角形 var row = prompt("请输入需要打印的行数"); for (var i = 1; i <= row; i++) { for (var j = 1; j <= i; j++) {
是阿超
2021/10/15
8530
JS根据列表排列对象数组
] const sortInfo = ['f','c','b'] nodeData_.sort((a, b) => {
小仙女闯运维
2020/09/23
4.5K0
根据rpt文件打印报表
不用一个个地导入rpt文件,再去写固定的代码,而是每次动态的根据指定的名称去加载报表和打印   if(Session["PrintXml"]!=null)    {     ReportDocument rd=new ReportDocument();     rd.Load (this.Server.MapPath("\\Flow\\FlowForm\\rpt")+"\\"+Session["PrintFormName"]+".rpt");     rd.SetDataSource(XmlPage.Get
用户1075292
2018/01/23
1.3K0
WEB打印-根据需求打印局部源码记录
这次的需求可能就比较简单了,就是实现web端的打印,但是是根据需求打印,而不是直接打印全部
何处锦绣不灰堆
2020/05/29
8500
WEB打印-根据需求打印局部源码记录
用户输入
大多数程序都在解决最终用户问题,为此通常需要从用户那里获取一些信息。在程序需要一个名字时,你需要提示用户输入该名字;程序需要一个名字时,你需要提示用户输入一系列名字。
狼啸风云
2019/01/18
9700
扫码打印新的实现方法(打印时输入)
打印时输入的是Label mx 条码软件的文字、条码、二维码共有属性,实现扫描一个条码,打印一个新标签,常用于重新贴码的包装箱或产品贴。下图为文字、条码、二维码的“打印时输入”属性设置:
用户6708611
2023/07/05
4680
扫码打印新的实现方法(打印时输入)
SAP 根据PO查找对应的打印FORM
正文部分 1、TCODE:NACE进入 找到 输出控制条件对应的应用程序名字,如下图: 2、选中应用程序后,点击上面菜单里的输出类型,如下图
matinal
2020/11/27
7620
Vue根据数据字段大小进行排列
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <script type="text/javascript" src="http://cdn.suol
明知山
2020/09/03
8370
打印不重复的字符串全排列(递归)
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 
砖业洋__
2023/05/06
3970
打印不重复的字符串全排列(递归)
Dynamic ReLU:根据输入动态确定的ReLU
这是我最近才看到的一篇论文,它提出了动态ReLU (Dynamic ReLU, DY-ReLU),可以将全局上下文编码为超函数,并相应地调整分段线性激活函数。与传统的ReLU相比,DY-ReLU的额外计算成本可以忽略不计,但表示能力明显增强,并且实现简单,所以可以非常简单的对我们现有的模型进行修改。
deephub
2023/08/30
1850
Dynamic ReLU:根据输入动态确定的ReLU
java 输出字符串的所有排列_Java程序打印字符串的所有排列
static void print_permutations(String my_str,String my_ans){
用户7886150
2021/04/29
1.1K0
Angular 2 用户输入
等号左边的 (click) 表示把该按钮的点击事件作为绑定目标 。 等号右边,引号中的文本是一个 模板语句
陈不成i
2021/07/26
1.7K0
Python之用户输入
大多数程序都旨在解决最终用户的问题,为此,需要从用户那里获取一些信息。函数input()让程序暂停运行,等待用户输入一些文本。
py3study
2020/01/06
1.2K0
python 接收用户的输入
None是一个特殊的常量。 None和False不同。 None不是0。 None不是空字符串。 None和任何其他的数据类型比较永远返回False。 None有自己的数据类型NoneType。 你可以将None复制给任何变量,但是你不能创建其他NoneType对象。
py3study
2020/01/09
2K0
python 接收用户的输入
输入数字n然后输出0到n的全排列
给定一个正整数n, 则输出0到n的所有排列 输入:2 输出:012 021 102 120 201 210 代码: private static Set<String> result = new HashSet<String>(); public static void allSort(int number) { if (number < 0) { return; } String str=""; for (int i = 0;i <= number; i
用户6055494
2019/10/21
1.1K0
python用户输入(三)
name = "Li QW" #定义变量 fname = name  #fname等于name变量产生的值 print("My name is " , name,fname) name = "study"
py3study
2020/01/13
1K0
android adb logcat 根据包名打印日志
android根据包名打印日志 Linux or Mac: adb logcat | grep -F "`adb shell ps | grep com.abc.package | cut -c10-15`" windows: adb logcat | findstr com.abc.package adb logcat -v time | find “XXX” >D:\myLog2.txt "XXX"可以用包名,或者关键字去代替。
tea9
2022/07/16
2.2K0
Shell - 根据用户名查询该用户的相关信息
小小工匠
2023/09/01
1750
Shell - 根据用户名查询该用户的相关信息
点击加载更多

相似问题

根据用户输入的数字重新排列文本输入字段

20

如何根据用户输入打印if语句?

30

根据用户输入打印回算

24

根据用户输入打印不同的句子

20

根据用户的输入,打印正确的事件

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文