Friendly_ID возвращает только один объект, когда многие соответствуют критериям поиска - PullRequest
0 голосов
/ 25 июня 2018

У меня есть столбец с именем ticker на моей PortStock модели.У меня есть настройка friendly_id, чтобы я мог использовать тщетные URL-адреса, т. Е. Он может использовать тикер в качестве идентификатора, а не сам идентификатор.

Проблема заключается в том, что у пользователя может быть много port_stock объектов, которые имеют одинаковые ticker значение.Но 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">

Однако, если я запрашиваю все port_stocks с тем жеticker значение, я получаю 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 не должен возвращать все объекты, которые соответствуют этому запросу?

1 Ответ

0 голосов
/ 25 сентября 2018

Я считаю, что ваш второй метод запроса правильный.Дружелюбная находка слизня уникальна.

Из документации ...

В ней говорится ...

При попытке вставить запись, которая создаст дубликатFriendly ID, FriendlyId добавит UUID к сгенерированному слагу для обеспечения уникальности:

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, добавленным к вашим настройкам.В вашем случае вызов friendly.find("CAC") - это то же самое, что find(14).

...