Ссылка на связанную таблицу в ActiveRecord, где вызов / join - PullRequest
2 голосов
/ 20 января 2012

Допустим, у меня есть две модели Rails: пользователи и списки. У пользователей есть много списков и списков, принадлежащих пользователю.

У пользователей также есть один конкретный список, над которым они работают в любой момент времени. Это обозначается внешним ключом active_list_id в модели User.

Допустим, я хочу выполнить эквивалент следующего запроса через ActiveRecord:

SELECT * FROM users JOIN lists 
ON lists.id = users.active_list_id

В основном я пытаюсь написать метод, который заставит каждого пользователя вместе с его текущим активным списком отображать статистику по заполнению списка.

Решение мне кажется, что-то вроде

Users.joins(:lists).where("users.active_list_id  = lists.id") 

Но я не могу заставить это работать **, и я не уверен, какое самое идиоматически правильное решение в Rails.

Как наиболее эффективно и эффективно извлекать эти данные с помощью ActiveRecord?

Заранее благодарим за любую помощь, которую вы можете предложить.

РЕДАКТИРОВАТЬ: вышеупомянутый запрос работает, но, кажется, не тянет связь пользовательской записи и связанного с ней списка.

Ответы [ 2 ]

1 голос
/ 20 января 2012

попробуйте это:

Users.includes(:lists).where("users.active_list_id  = lists.id") 

то, что вы делаете в своем вопросе, загружает пользователей, которые соответствуют этим критериям, в то время как вы хотите нетерпеливо загрузить ассоциацию какну

Хотя на самом деле вы могли бы рассмотреть возможность сделать это отдельной ассоциацией:

class User
  belongs_to :active_list, :class_name => :list
end

class List
  has_one :user
end
1 голос
/ 20 января 2012

В вашем сообщении есть несколько странных вещей. Во-первых, «have_many», что неправильно, называется has_many, что может быть проблемой, если его в вашей модели, как вы записали! Тогда другая вещь - это имя внешнего ключа! Внешний ключ по соглашению - это название ассоциации в единственном числе с добавлением _id. Когда вы говорите, что хотите hasv user.lists, внешний ключ должен называться list_id, а не active_list_id! Вы можете указать нестандартный внешний ключ, передав опцию foreign_key в ассоциации! Это будет выглядеть так:

User.rb:

has_many :lists, :foreign_key => 'active_list_id'

List.rb:

belongs_to :user, :foreign_key => 'active_list_id'

Тогда вы сможете сказать это так:

User.find(<id>).lists

Вы НИКОГДА не соединяете таблицы в рельсах, используя SQL! Не пытайтесь передавать знания PHP в RoR 1 к 1, просто не делайте этого!

// Ааа, теперь я понимаю, что вы ceed это сфера с параметрами! User.rb:

scope :active_list, lambda{|list_id| where(:active_list_id =>  list_id)}

Тогда вы можете позвонить User.active_list(<list_id>), чтобы получить список всех пользователей, использующих этот список!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...