2
Class Item
    has_many :prices
    has_one  :current_price
end

Class Price
   belongs_to :item
   #date the price was set attribute
   #price attribute
end

我如何在“current_price”字段中找到我正在销售的所有商品,包括(急切地加载)当前价格(包含给定商品的 max() 日期的价格)?

例如:

表项:

id=1 | 名称="the_hobbit"

餐桌价格:

id=1 | item_id=1 | 价格=10.99 美元 | 日期=2010-01-01

id=2 | item_id=1 | 价格=12.59 美元 | 日期=2009-04-23

id=3 | item_id=1 | 价格=19.99 美元 | 日期=2013-01-03

@item = Items.find(1)
@item.current_price # should print "19.99$"

编辑:我相信我的问题被称为“每组最大 n ”,但我无法弄清楚如何通过“has_one”关联正确地做到这一点......

4

3 回答 3

2

在 has_one 宏上使用 order 选项:

class Item
    has_many :prices
    has_one  :current_price, :order => "date DESC" 
end

Has_one 当然只会包含一个 sql 级别的价格。但是,如果您已经使用 has_many :prices 加载了每件商品的所有价格,那么您可以诉诸纯 Ruby 并具有一些可枚举的优点

@item.prices.sort_by(&:date).last 

...这将为您提供最新的价格。

当我这样做时,您最好这样做:

class Item
    has_many :prices, :order => "date"
    has_one  :current_price, :order => "date DESC" 
end

@item.prices.last 

因为价格是由 SQL 预先排序的(这样更快......)

于 2013-01-18T06:05:38.483 回答
1

无需其他关联,只需使用自定义方法即可。

Class Item
    has_many :prices

    def current_price
        return self.prices.last
    end
end
于 2013-01-18T08:36:38.900 回答
1

您应该为此使用 class_name 和外键,还需要按日期或所需内容排序,在我的情况下它是版本,对于您的情况,我写了 created_at 字段

class Item
     has_one :current_price, -> { order created_at: :desc }, class_name: 'Price', foreign_key: :item_id
end

现在,当您需要获取项目的最新价格时,您只需致电

@item = Item.find_by(id: params[:id]).current_price

它会返回给您该商品的最新价格,您还可以将该价格与商品哈希合并使用

@item = Item.find_by(id: params[:id])

@item.merge({current_price: @item.current_price})

:current_price并且输出将与最新相关价格的键和值进行散列

于 2017-02-13T10:47:24.947 回答