当许多对象与查找条件匹配时,Friendly_ID仅返回一个对象



我的PortStock模型上有一个名为ticker的列。我已经设置了friendly_id,所以我可以使用虚 URL,即它可以使用股票代码作为 ID 而不是 ID 本身。

问题是用户可以有许多具有相同ticker值的port_stock对象。但是friendly_id并没有在标准的friendly.find调用中返回所有这些。

例如:

[15] pry(main)> cac = cu.port_stocks.friendly.find("CAC")
PortStock Load (3.1ms)  SELECT  "port_stocks".* FROM "port_stocks" INNER JOIN "portfolios" ON "port_stocks"."portfolio_id" = "portfolios"."id" WHERE "portfolios"."user_id" = $1 AND "port_stocks"."ticker" = $2 LIMIT $3  [["user_id", 2], ["ticker", "CAC"], ["LIMIT", 1]]
=> #<PortStock:0x00007ff143b53768
id: 14,
portfolio_id: 1,
stock_id: 58,
volume: 250,
transaction_price: 8.0,
current_price: 8.0,
action: "sell",
position: "closed",
ticker: "CAC">

但是,如果我查询具有相同ticker值的所有port_stocks,则会得到 6 个对象:

[16] pry(main)> cu.port_stocks.where(ticker: "CAC").count
(3.7ms)  SELECT COUNT(*) FROM "port_stocks" INNER JOIN "portfolios" ON "port_stocks"."portfolio_id" = "portfolios"."id" WHERE "portfolios"."user_id" = $1 AND "port_stocks"."ticker" = $2  [["user_id", 2], ["ticker", "CAC"]]
=> 6
[17] pry(main)> cu.port_stocks.where(ticker: "CAC")
PortStock Load (1.1ms)  SELECT "port_stocks".* FROM "port_stocks" INNER JOIN "portfolios" ON "port_stocks"."portfolio_id" = "portfolios"."id" WHERE "portfolios"."user_id" = $1 AND "port_stocks"."ticker" = $2  [["user_id", 2], ["ticker", "CAC"]]
=> [#<PortStock:0x00007ff143b33e68
id: 14,
portfolio_id: 1,
stock_id: 58,
volume: 250,
transaction_price: 8.0,
current_price: 8.0,
action: "sell",
position: "closed",
ticker: "CAC">,
#<PortStock:0x00007ff143b33d28
id: 2,
portfolio_id: 1,
stock_id: 58,
volume: 250,
transaction_price: 7.4,
current_price: 8.0,
action: "buy",
position: "open",
ticker: "CAC">,
#<PortStock:0x00007ff143b33be8
id: 15,
portfolio_id: 1,
stock_id: 58,
volume: 30,
transaction_price: 7.95,
current_price: 8.0,
action: "sell",
position: "closed",
ticker: "CAC">,
#<PortStock:0x00007ff143b33aa8
id: 3,
portfolio_id: 1,
stock_id: 58,
volume: 45,
transaction_price: 7.8,
current_price: 8.0,
action: "buy",
position: "open",
ticker: "CAC">,
#<PortStock:0x00007ff143b33968
id: 16,
portfolio_id: 1,
stock_id: 58,
volume: 125,
transaction_price: 7.9,
current_price: 8.0,
action: "sell",
position: "closed",
ticker: "CAC">,
#<PortStock:0x00007ff143b33828
id: 10,
portfolio_id: 1,
stock_id: 58,
volume: 125,
transaction_price: 6.5,
current_price: 8.0,
action: "buy",
position: "open",
ticker: "CAC">]

可能是什么原因造成的?

friendly_id不应该返回与该查询匹配的所有对象吗?

我相信您的第二种查询方法是正确的。友好的发现鼻涕虫独特。

从文档中...

它指出...

当您尝试插入将生成重复友好 ID 的记录时,FriendlyId 会将 UUID 附加到生成的 slug 以确保唯一性:

car = Car.create :title => "Peugeot 206"
car2 = Car.create :title => "Peugeot 206"
car.friendly_id #=> "peugeot-206"
car2.friendly_id #=> "peugeot-206-f9f3789a-daec-4156-af1d-fab81aa16ee5"

所以我敢肯定,如果你在PortStock模型中查看你的蛞蝓,(如果你在模型中使用ticker作为你的蛞蝓(......

friendly_id :ticker, :use => [:slugged, :finders]

您会发现许多将 UUID 附加到您的 slug 的记录。在您的情况下,呼叫friendly.find("CAC")与呼叫find(14)相同。

最新更新