Я новичок в рельсах.Я на взводе.API запросов, однако, доставляет мне некоторые проблемы.Я очень быстро масштабирую и делаю много вещей, но впервые я потратил часы, пытаясь понять это.Это не то, что я использовал раньше - обычный SQL, Hibernate или что-то еще.
У меня довольно простая модель.
- В PrivateMessage много получателей
- Получатель имеет получателя (который относится к классу User)
- получатель также имеет поля для 'is_read' и 'is_deleted'
Моя цель -построить запрос, который находит все непрочитанные и не удаленные личные сообщения для данного пользователя.Для этого нам нужно присоединить «private_messages» к «получателям» ..., а затем «получателей» к «пользователям».
Вот соответствующий код модели пользователя:
has_many :sent_messages, :class_name => 'PrivateMessage', :foreign_key => 'sender_id'
has_many :recipient_of_messages, :class_name => 'Recipient', :foreign_key => 'receiver_id'
scope :by_id, lambda { |id| where(:id => id) }
Модель моего получателя имеет следующий соответствующий код:
belongs_to :receiver, :class_name => 'User', :foreign_key => "receiver_id"
belongs_to :private_message
scope :unread, where(:is_read => false).where(:is_deleted => false)
scope :by_receiver_id, lambda { |id| Recipient.joins(:receiver).merge(User.by_id(id)) }
scope :unread_by_receiver_id, lambda { |id| unread.by_receiver_id(id) }
При тестировании в отдельности это работает на 100%.
Однако, когда я кодирую запросы личных сообщений, я сталкиваюсь с проблемами.
belongs_to :sender, :class_name => 'User'
has_many :recipients, :class_name => 'Recipient'
scope :sorted, order("private_messages.created_at desc")
scope :non_deleted, where(:is_deleted_by_sender => false)
scope :non_deleted_by_sender_id, lambda { |id| sorted.non_deleted.joins(:sender).merge(User.by_id(id)) }
# this scope does not work
scope :non_deleted_by_receiver_id, lambda { |id| sorted.joins(:recipients).merge(Recipient.by_receiver_id(id)) }
scope :newest, sorted.limit(3)
# this scope does not work either
scope :newest_unread_by_receiver_id, lambda { |id| newest.joins(:recipients).merge(Recipient.unread_by_receiver_id(id)) }
Когда я пытаюсь использовать 'newest_unread_by_receiver_id' или 'non_deleted_by_receiver_id', я получаю следующее исключение:
ActiveRecord::ConfigurationError: Association named 'receiver' was not found; perhaps you misspelled it?
Это не имеет большого смысла для меня ... потому что еслиимя было написано неправильно, почему оно не дает сбой, когда я проверяю его изоляцию?
Может кто-нибудь помочь мне, пожалуйста?Этот сводит меня с ума.В такие моменты я просто хочу программировать в полном sql или Hibernate QL, чтобы я мог просто покончить с этим: (
Если я просто неправильно подхожу к проблеме, то я был бы признателен, если бывы просто дайте мне знать об этом. У меня сложилось впечатление, что использование областей и ActiveRelation было способом продвижения вперед в Rails 3.1.
Спасибо