`.joins` не работает для has_many в Rails 3.2 на PostgreSQL - PullRequest
2 голосов
/ 01 февраля 2012

Я обновляю устаревший проект до Rails 3.2.1, но у меня возникают проблемы с новым интерфейсом запросов ActiveRecord, особенно с новым методом join.

У меня есть User модель, которой принадлежит множество Podcast s

class User < ActiveRecord::Base
  has_many :podcasts
end

class Podcast < ActiveRecord::Base
  belongs_to :user
end

Моя проблема в том, что join работает только при вызове со стороны belongs_to.

irb(main):005:0> Podcast.joins :user
  Podcast Load (1.4ms)  SELECT "podcasts".* FROM "podcasts" INNER JOIN "users" ON "users"."id" = "podcasts"."user_id"
  => []

irb(main):006:0> User.joins :podcast
  ActiveRecord::ConfigurationError: Association named 'podcast' was not found; perhaps you misspelled it?

Странно, но все работает, если я поменяю отношение на has_one.

Соответствующая часть моего schema.rb

create_table "podcasts", :force => true do |t| 
  t.string   "name",         :default => "",   :null => false
  t.string   "url",          :default => "",   :null => false
  t.text     "description"
  t.datetime "last_updated"
  t.boolean  "active",       :default => true
  t.integer  "user_id"
end 

Базовая БД: PostgreSQL 9.1.2 , а ruby ​​- 1.8.7-p357 .

Это предполагаемое поведение?

Я знаю, что могу передать SQL в join, но это будет значительным шагом назад с точки зрения читабельности.

1 Ответ

4 голосов
/ 01 февраля 2012

Вы должны использовать :podcasts:

User.joins :podcasts

Символ, который вы используете с joins, должен соответствовать символу, который вы используете в ассоциации. Из Руководства по интерфейсу запросов Active Record :

class Category < ActiveRecord::Base
  has_many :posts
end
class Post < ActiveRecord::Base
  belongs_to :category
  has_many :comments
  has_many :tags
end

[...]

Вступление в единую ассоциацию

Category.joins(:posts)
...