我的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)
相同。