Rails Tutorial 3.2 SQL-синтаксис Ch11 - PullRequest
       19

Rails Tutorial 3.2 SQL-синтаксис Ch11

1 голос
/ 01 апреля 2012

Я изучаю рельсы из учебника рельсов.У меня проблема в Разделе 11.3.1 , код в Листинге 11.44:

def self.from_users_followed_by(user)
  followed_user_ids = user.followed_user_ids.join(', ')
  where("user_id IN (?) OR user_id = ?", followed_user_ids, user)
end

не будет возвращать user_id в follow_user_ids.

После поиска в stackoverflowЯ нашел решение здесь , в котором говорится, что просто удалите метод "join", и он работает для меня.

Но мне любопытно, почему при запуске RSPEC не возникает ошибкаудалите метод "join".

В листинге 11.41:

subject { Micropost.from_users_followed_by(user) }

it { should include(own_post) }
it { should include(followed_post) }

Если метод "join" сделает оператор SQL неверным, почему RSPEC прошел?

У кого-нибудь есть такая же проблема?

Обновление 2012.04.03

Я использовал консоль rails для проверки проблемы.

user = User.first
ids = ids = user.following_users.map(&:id).join(', ')

Который получил

User Load (2.6ms)  SELECT "users".* FROM "users" INNER JOIN "follows" ON
"follows"."followable_id" = "users"."id" AND "follows"."followable_type" = 'User' WHERE    
"follows"."blocked" = 'f' AND "follows"."follower_id" = 1 AND "follows"."follower_type" 
= 'User' AND "follows"."followable_type" = 'User'
=> "6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29,    
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
52, 55, 56, 5"

Затем SQL

Collection.where("user_id IN (?)", ids)

Результат

Collection Load (0.7ms)  SELECT "collections".* FROM "collections" WHERE (user_id IN 
('6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
52, 55, 56, 5')) ORDER BY collections.created_at DESC
=> []

, который возвращает пустой массив.

Но я получил все мои rspec.До сих пор не знаю.

1 Ответ

0 голосов
/ 01 апреля 2012

Предполагая, что объединение создает строку '1,2,3', тогда, возможно, вы хотите, чтобы join("','") имел ('1','2','3'), но я не думаю, что это сработает - я уверен, что PostgreSQL не любит идентификаторы как строки.

В качестве альтернативы:

Squeel - это хороший гем синтаксиса SQL, в котором вы можете использовать:

user = User.first
ids = user.following_users.map(&:id)
Collection.where{(user_id.like_any ids)}

Это позволит вам передать массив целых чисел, а Squeel настроит запрос, где:

SELECT "collections".* FROM "collections" WHERE (("collections"."user_id" LIKE 1 OR "collections"."user_id" LIKE 2 OR "collections"."user_id" LIKE 3))

РЕДАКТИРОВАТЬ: Вы также можете использовать синтаксис:

ids = User.first.following_users.pluck(:id)
Collection.find_by_user_id(ids)
...