优雅地从 has_many 中选择属性:通过 Rails 中的连接模型

2024-02-15

我想知道从 has_many 中的连接模型选择属性的最简单/最优雅的方法是什么:通过关联。

假设我们有具有以下 Item 类的 Items、Catalogs 和 CatalogItems:

class Item < ActiveRecord::Base
      has_many :catalog_items
      has_many :catalogs, :through => :catalog_items
end    

此外,假设 CatalogueItems 具有位置属性,并且任何目录和任何项目之间都只有一个 CatalogueItem。

检索位置属性的最明显但有点令人沮丧的方法是:

@item         = Item.find(4)
@catalog      = @item.catalogs.first
@cat_item     = @item.catalog_items.first(:conditions => {:catalog_id => @catalog.id})
position      = @cat_item.position

这很烦人,因为我们似乎应该能够执行@item.catalogs.first.position,因为我们已经完全指定了我们想要的位置:对应于@item目录中第一个的位置。

我发现得到这个的唯一方法是:

class Item < ActiveRecord::Base
      has_many :catalog_items
      has_many :catalogs, :through => :catalog_items, :select => "catalogue_items.position, catalogs.*"
end

现在我可以执行 Item.catalogs.first.position。然而,这看起来有点像黑客 - 我在 Catalog 实例上添加了一个额外的属性。它还提供了尝试在两种不同情况下使用视图的可能性,其中我使用 Catalog.find 或 @item.catalogs 填充 @catalogs。在一种情况下,该位置将会存在,而在另一种情况下,则不会。

有人对此有好的解决方案吗?

Thanks.


你可以这样做:

# which is basically same as your "frustrating way" of doing it
@item.catalog_items.find_by_catalogue_id(@item.catalogs.first.id).position

或者您可以将其包装到 Item 模型的实例方法中:

def position_in_first_catalogue
  self.catalog_items.find_by_catalogue_id(self.catalogs.first.id).position
end

然后像这样调用它:

@item.position_in_first_catalogue
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优雅地从 has_many 中选择属性:通过 Rails 中的连接模型 的相关文章

  • 如何在 Rails 6 中禁用 TurboLinks?

    所以我面临这个问题 我的服务器实际上从客户端的请求中检索了正确的数据 并将这些数据发送到浏览器 我可以清楚地看到它可用于浏览器 CTRL SHIFT C gt Network gt my request 但是 浏览器不会刷新 所以我现在看到
  • BigDecimal 无法强制转换为 BigDecimal

    这应该很简单 但它却爆炸了 有任何想法吗 d BigDecimal new 2 0 YAML load a gt d to yaml TypeError BigDecimal can t be coerced into BigDecimal
  • 如何使用 ruby​​ 的循环和 haml 创建表?

    我正在尝试制作一个如下所示的 html 表 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 我的数据结构是这样的 f ary 1 250 这是我的哈姆尔代码 table border gt 1 tbody tr cnt 0 f
  • Rails 中的并行方法

    我的 Rails Web 应用程序有数十种方法 从调用 API 到处理查询结果 这些方法具有以下结构 def method one batch query API process data end def method nth batch
  • ruby on Rails,会话过期通知

    我正在使用 ruby 1 9 3 和 Rails 3 2 我的实际会话处理如下所示 会话助手 def sign in user cookies remember token value user remember token expires
  • 由于符号链接错误,无法在 Mac OSX 10.8.1 中安装 ruby​​-1.9.2

    首先 我尝试了常见的rvm安装 rvm安装1 9 2 但是 显示了以下错误 The provided compiler usr bin gcc is LLVM based it is not yet fully supported by r
  • Eventmachine start_tcp_server 无接受器 - 端口正在使用或需要 root 权限(运行时错误)

    我已经 3 天无法运行本地服务器了 重新启动我的计算机没有帮助 有几次 在反复尝试大约 40 50 次之后 它随机地起作用了 我不明白为什么 我尝试过一次不同的端口并且有效 但从那以后 没有端口有效 每次我尝试运行我的 Rails 服务器时
  • Memcachier 达到缓存限制时 Heroku 请求超时

    我使用 Memcachier Dalli 作为客户端 将 Rails 应用程序部署到 Heroku 我正在使用免费插件 提供 25 MB 缓存 我们开始收到来自heroku的请求超时 经过调试 我们发现手动刷新Memcachier解决了问题
  • Rails Searchkick / Elasticsearch has_many 和belongs_to 关联

    我尝试使用 Searchkick 运行搜索并基于多个模型返回 我的书本模型包含这个 class Book lt ActiveRecord Base searchkick has many book subjects has many sub
  • 使用 Minitest 测试自定义验证器

    我有多个带有电子邮件验证的模型 因此 我将验证提取到自定义验证器中 我按照以下教程做到了这一点导轨指南 http guides rubyonrails org active record validations html custom va
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • 自定义变形在rails3上不起作用?

    我正在使用 Rails 3 0 1 并在initializers inflections rb 中有以下代码 ActiveSupport Inflector inflections do inflect inflect irregular
  • HABTM 关系和accepts_nested_attributes_for

    我有一个可以让我创建的表单新博客文章我希望能够创造新类别来自同一个表格 我在帖子和类别之间有一个习惯关系 这就是我遇到麻烦的原因 我有以下2个型号 class Post lt ActiveRecord Base has and belong
  • 回形针不支持 .doc 文件

    在 Rails 4 0 2 中 我使用回形针 gem 上传文件 但它不支持 doc 文件 在文件上传字段下方 显示一条错误消息 扩展名与其内容不匹配 在模型中 检查内容类型的验证如下 validates attachment content
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • 自定义通用 Rails 错误消息

    我们的 Rails 应用程序被设计为链接到多个客户端数据库的单个代码库 根据子域 应用程序确定要连接到哪个数据库 我们使用液体模板为每个客户定制演示文稿 我们无法为每个客户定制通用的 我们很抱歉 出了点问题 消息 谁能推荐一种方法让我们能够
  • 如何在服务调用后检查 rspec 中的数组更改?

    目标很简单 例如我们有一个数组 name ghost state rejected name donkey state rejected 运行服务调用后UpdateAllUsers 这会将所有用户更改为 accepted name ghos
  • 通过 ESI:include 设置 Cookie,如何?

    我正在尝试使用 esi 在我的网站上创建忍者缓存 这个想法是 该网站大部分是静态的 我只需要在用户是否登录时做一些花哨的事情 所以我试图在页面A上放置一个 并在页面B的应用程序中设置触发器 这样我就可以将页面 A 缓存在 varnish 上
  • 有时您可能需要重新启动 Webrick 才能看到所做的更改,这是否正确?

    我听 Kevin Skoglund lynda com 说 养成在开发过程中频繁重新启动 Webrick 的习惯是一个很好的习惯 虽然通常您不需要重新启动 Webrick 来查看更改 但他暗示在某些特殊情况下可能需要这样做 有谁知道这些情况
  • 在 ActiveAdmin 或打印解决方案中动态更改分页

    我是 Activeadmin 和 Rails 的新手 我需要一些帮助 我有一个分页模型 我想允许用户更改分页值或完全禁用它 这样它就可以打印 到打印机 所有记录 或过滤后的记录 我知道我可以在 before filter 中使用 per p

随机推荐

  • 访问 Mongoose.js 架构中 Enum 字段的有效值列表

    有一天 我在网上某处看到一条评论 告诉人们如何访问为 Mongoose js 架构中的 Enum 字段定义的值列表 遗憾的是 我没有记住这个花絮或其 URL 但现在我需要它 有谁知道如何做到这一点 提前致谢 这是您要找的吗 var mong
  • 如何从 Firebase 中的实时数据库获取数据

    我已使用实时数据库进行此设置 gt users gt uid gt name gt email gt other info 如果我想保存用户数据 我将使用我的 User 类 然后在数据库中设置对象 如下所示 assume variables
  • 如何:javascript 淡入淡出文本

    首先 我浏览了 stackoverflow 上的其他帖子 但没有一个包含我正在寻找的信息 第二 我是编程新手 我想在我的网站上有一个淡入和淡出文本的 div 我在一些网站上看到过这个 我很确定它是使用 jQuery 库的 javaScrip
  • 找到列表中的所有山丘和山谷

    我正在编写一个函数来查找给定列表中的所有山丘和山谷 例如 1 0 0 0 1 返回 3 0 1 0 1 0 返回 5 0 2 2 1 1 0 0 返回 3 如果一个数字 或具有相同值的连续数字 比它的两个邻居都大或小 它被认为是一座山或一座
  • “未处理的 JS 异常:类型错误”

    我刚刚重置了 iPhone 模拟器的设置 通过点击 重置内容和设置 现在我遇到了以前从未遇到过的问题 这里是 我坚持认为该项目在重置之前完美运行 但我需要清除应用程序的本地存储 当人们更改位置时 我确实看到了一些帖子index ios js
  • gvisScatterChart 动态定义系列

    我正在动态创建几个gvisScatterCharts 我想定义每条线的颜色 我可以使用系列和颜色属性来完成 没有什么比订单或固定数字更能让我预先定义颜色的了 所以我想创建一个与我的颜色平行的属性数组 并将其放在series myColors
  • 如何启用格式化的 Xdebug 错误和跟踪

    我不确定我何时或更改了什么 但突然 xdebug 不再呈现其格式化的堆栈跟踪 相反 它在没有任何 HTML 的情况下呈现 stacktrtace 这是一个例子 http berkes openphoto me photo l view 而我
  • 模型继承和属性默认值

    我有一个带有类别属性和几个子类的主类 我想为每个子类设置默认类别 例如 class BaseAd models Model CATEGORY CHOICES 1 Zeta 2 Sigma 3 Omega category models In
  • 无法在准备好的 INSERT 语句中使用 python mysql.connector 中的 None (NULL) 值

    当尝试使用准备好的光标并插入时NULL重视mysql 连接器报错 mysql Error 1210 HY000 Incorrect arguments to mysqld stmt execute 这是准确显示这一点的代码 from fut
  • 如何在mysql的列之间进行搜索

    我有两列存储值 数字 如何选择给定数字在两列中的值之间的位置 例子 id col1 col2 1 20 50 2 200 400 3 500 650 如果我的值为 25 我如何选择值 25 位于它们之间的记录 在本例中为第 1 行 sele
  • C 或 C++ 中 >>= 的含义是什么?

    的含义是什么 gt gt C 或 C 中的符号 它有什么特别的名字吗 我有这个for循环一些 CUDA 代码 如下所示 for int offset blockDim x offset gt 0 offset gt gt 1 Some co
  • Numpy 将布尔数组的字符串表示形式转换为布尔数组

    是否有一种原生的 numpy 方法来转换布尔值的字符串表示数组 例如 True False True False 对于我可以用于屏蔽 索引的实际布尔数组 我可以做一个 for 循环来遍历并重建数组 但对于大型数组来说 这很慢 您应该能够进行
  • 验证插件未验证所有字段

    我正在使用 jQuery 验证插件进行表单验证 它只是检查第一个字段 如果第一个字段验证为真 则正在提交表单 它不验证其余字段 我正在使用引导程序3 0
  • 输入语句块时会创建新的堆栈帧吗? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 语言中 大括号充当堆栈框架吗 https stackoverflow com questions 2759371 in c do braces act as a stack frame int
  • Selenium:如何点击javascript按钮

    我必须编写一些用于自动测试的脚本 以检查使用 flex amf 技术构建的 Web 应用程序的加载时间 测试将包括打开 IE 浏览器 浏览多个选项卡 并测量从单击最后一个选项卡加载页面内容到关闭浏览器的时间 我使用 Selenium Web
  • RavenDB 索引错误

    我刚刚开始使用 Raven 我创建的索引始终无法索引任何内容 我在 Raven 服务器上发现了很多如下所示的错误 Index HomeBlurb IncludeTotalCosts Error Cannot implicitly conve
  • VB.NET 尝试将通用 Invoke 方法修改为通用 BeginInvoke 方法,出现意外问题

    VB NET 2010 NET 4 Hello 我一直在使用一种非常灵活的通用调用方法来从后台线程更新 UI 我忘记了从哪里复制它 从 C 将其转换为 VB NET 但它是 Public Sub InvokeControl Of T As
  • Reflection.Emit 和泛型类型

    我在用Reflection Emit我想创建一个与 C 中定义的以下类型等效的类型 class A public Tuple
  • 如何在 Mercurial 中添加远程存储库?

    我通过以下方式使用 Git 存储库 我在不同的生产机器上有主存储库和几个遥控器 我将生产代码推送到远程并重新启动服务以使更改生效 我即将从 Git 切换到 Mercurial 我想提前知道如何实现类似的目标 您将条目添加到 paths 本地
  • 优雅地从 has_many 中选择属性:通过 Rails 中的连接模型

    我想知道从 has many 中的连接模型选择属性的最简单 最优雅的方法是什么 通过关联 假设我们有具有以下 Item 类的 Items Catalogs 和 CatalogItems class Item lt ActiveRecord