Rails Ruby Array Nil && [] - PullRequest
       3

Rails Ruby Array Nil && []

0 голосов
/ 23 февраля 2012

Почему некоторые запросы возвращают записи с [] и некоторым Nil?

Я пытаюсь выяснить, почему, если я запускаю выражение вроде:

user.articles # yields '[]' if the user has no articles

но если я напишу заявление вроде этого:

user.likes # yields Nil if empty

лайков будет методом в модели User и будет выглядеть примерно так:

def likes
    Likes.find_by_user_id(id)
end

Likes будет объединяющей таблицей, содержащей user_id и article_id.

На мой взгляд, я хотел бы сделать следующее:

user.likes.count

На самом деле, теперь, когда я думаю об этом, было бы здорово сделать это:

@user.articles.likes 

и получите массив статей, которые понравятся пользователю.

Имеет смысл?

У меня такое ощущение, что в моих моделях для этого требуется параметр: through, но я еще не понял этого и не знаю, подходит ли он.

Ответы [ 3 ]

6 голосов
/ 23 февраля 2012

Account.find_by_user_name ( 'ajik') => ноль

Account.find_all_by_user_name ( 'ajik') => []

Методы, которые должны возвращать одну запись, возвращают ноль, если не совпадают. Те, которые должны возвращать много записей, вместо этого возвращают пустую коллекцию.

3 голосов
/ 23 февраля 2012

В то время как ответ Виртуалов будет работать, вы должны прочитать об отношениях ActiveRecordВаш сценарий может быть настроен так: (только грубый набросок, опуская детали)

class User
  has_many :likes
  has_many :articles, :through => :likes
end

class Article
  has_many :likes
  has_many :users, :through => :likes
end

class Likes
  belongs_to :user
  belongs_to :article
end

Это даст вам большую часть необходимой вам функциональности (и многое другое)

Обновление

Я добавил has_many, который имеет больше смысла и должен работать лучше для вас.Мне не очень нравятся названия, потому что теперь вы можете получить доступ к чему-то вроде @ user.articles, в котором будут использоваться определенные ассоциации.Обычно @ user.articles означает, что статьи напрямую связаны с пользователем (имеют собственное поле user_id).Вы можете использовать что-то вроде

has_many :liked_articles, :through => :likes

, а затем использовать

@user.liked_articles

Но для этого потребуется еще больше информации, поскольку вам придется явно указывать Rails имена полей id (такэто не будет работать точно так же, как я написал код, просто намек на то, что есть больше опций)

Есть еще больше опций с использованием областей или нового синтаксиса запроса Rails 3.x, например @ user.where (...), который работает проще, если вам нужно объединить несколько условий.

В общем, я бы рекомендовал установить как можно больше информации с такими ассоциациями, как has_many и own_to, поскольку таким образом Rails дает вам многофункциональности бесплатно, что иначе не получишь.Но может быть много причин сделать это так или иначе, так как часто в программировании нет 100% ответа, который подходит для любой ситуации.

3 голосов
/ 23 февраля 2012

Это потому, что пустая коллекция является нулевым объектом, когда нет результатов.Другими словами, если бы я попросил вас указать массив со всеми состояниями, которые начинаются с буквы «х», вы бы дали мне пустой массив.Это соответствует первому примеру статей. Вероятно, этот метод написан объявлением has_many (: article) в вашей модели.Это коллекция записей, так же как состояния, начинающиеся с «x», являются коллекцией состояний.Поэтому он возвращает пустой массив.

Но если бы я попросил одно состояние, начинающееся с буквы x, что бы вы мне дали?Вы не можете дать мне пустой массив, потому что он представляет коллекцию.Вам нужен объект, который представляет «ничто».Такой объект существует, он называется nil.

Кстати, обычно ваши модели единичны (Like, а не Likes), и метод find должен возвращать все лайки для этого идентификатора, а не только первыйодин.

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