gpt4 book ai didi

ruby-on-rails - 从 has_many :through join models in Rails 中优雅地选择属性

转载 作者:数据小太阳 更新时间:2023-10-29 07:20:10 24 4
gpt4 key购买 nike

我想知道从 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 了。但是,这似乎有点 hack——我在 Catalog 实例上添加了一个额外的属性。它还打开了尝试在两种不同情况下使用 View 的可能性,在这两种情况下,我使用 Catalog.find 或 @item.catalogs 填充 @catalogs。在一种情况下,职位会在那里,而在另一种情况下,不会。

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

谢谢。

最佳答案

你可以这样做:

# 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

关于ruby-on-rails - 从 has_many :through join models in Rails 中优雅地选择属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/428066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com