Запрос ActiveRecord возвращает неверную модель - PullRequest
0 голосов
/ 31 января 2012

Я немного почесал голову над этим, и хотя я уверен, что это глупая ошибка, я дошел до того, что должен проконсультироваться с СО, если я хочу сохранить оставшиеся волосяные фолликулы.

Я написал функцию в Rails (3.1.2), которая должна возвращать массив, заполненный объектами модели ActiveRecord (в данном случае пользователями), которые соответствуют определенному критерию.Критерий заключается в том, что текущий список пользователя (обозначаемый полем active_list_id) не должен быть равен нулю.Код выглядит следующим образом:

def build_list_array
   @lists = Array.new
   User.all.each do |user|
     @active_list_id = user.active_list_id
     @lists<< List.find(@active_list_id) if @active_list_id != nil #TODO WHAT?!? WHY IS  THIS RETURNING USERS?
   end
end

Как видите, я инициализирую пустой массив, циклически перебираю всех пользователей и добавляю их активный список в массив, если соответствующая ссылка на запись пользователя не равна нулю.Проблема в том, что возвращаются пользовательские объекты, а не списочные объекты.

Вот ассоциации пользователей и моделей списков:

user model:
  has_many :lists
  has_many :tasks

list model:
  belongs_to :user

Краткое слово о ссылке на active_list: AПользователь может иметь много списков, но только один активен в любое время.Поэтому мне нужно сослаться на этот список в записи пользователя.Таким образом, активный список не является внешним ключом в обычном смысле этого слова.

Я ценю любую помощь, которую вы можете мне оказать ... Спасибо =)

Ответы [ 4 ]

2 голосов
/ 31 января 2012

В существующем состоянии build_list_array вернет массив User из-за поведения each. При выполнении итерации по коллекции с использованием each вызов each возвращает исходную коллекцию.

Например,

list = []
# returns => []
[1,2,3,4,5].each { |number| list << number * 10 }
# returns => [1, 2, 3, 4, 5]
list
# returns => [10, 20, 30, 40, 50]

В вашем коде последний оператор в вашем методе build_list_array - это вызов each, означающий, что возвращаемое значение each - это то, что возвращается методом. Если бы вы просто добавили оператор return в конце метода, вам было бы хорошо пойти.

def build_list_array
  @lists = Array.new
  User.all.each do |user|
    @active_list_id = user.active_list_id
    @lists<< List.find(@active_list_id) if @active_list_id
  end
  return @lists  # Actually return @lists
end

При этом вам, вероятно, следует использовать что-то вроде ответа Брэдли в качестве основы для более "правильного" кода Rails.

2 голосов
/ 31 января 2012

each всегда возвращает коллекцию, по которой она повторяется (независимо от того, что происходит внутри блока). Похоже, вы хотите вернуть @lists в конце вашего метода.

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

List.joins('inner join users on active_list_id =lists.id')
1 голос
/ 31 января 2012

Расширяя ответ Стивена, чтобы получить списки

class User
  belongs_to :active_list, :class_name => "List"

def build_list_array
  @lists = User.where('active_list_id is not null').map(&:active_list).compact
1 голос
/ 31 января 2012

Арель Activerecord - ваш друг здесь:

User.where(:active_list_id.not_eq => nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...