2013-04-20 2 views
1

У меня есть 3 модели:Лучший способ заказать по ассоциациям

class Post 
    has_many :comments 
end 

class Comment 
    belongs_to :user 
    belongs_to :post 
end 

class User 
    has_many :comments 
end 

Теперь в контроллере, которые я хотел бы назвать @ post.comments и заказать эти комментарии по user.postcode. Я попытался следующие, но это не сработало:

class Post 
    has_many :comments, :order => "user.postcode" 
end 

Я также попытался:

class Comment 
    def order_by_user_postcode 
    includes(:user).order("user.postcode ASC") 
    end 
end 

class PostsController 
    @post.comments.order_by_user_postcode 
end 

что приводит к

undefined method for ActiveRecord::Relation 

Как я могу написать метод для цепи @post .comments для сортировки по user.postcode?

+0

попытка 'присоединяется (: пользователь) .order ("users.postcode") ' – Zippie

ответ

0

Вы должны заказать:

has_many :comments, :order => "users.postcode" 

Имя таблицы является пользователи не пользователь.

Второй вариант:

Вы должны реализовать метод, как метод класса (или объема), а не метод экземпляра

def self.order_by_user_postcode 
    joins(:user).order("users.postcode ASC") 
end 

или область применения:

scope :order_by_user_postcode, joins(:user).order("users.postcode ASC") 
+0

Спасибо за ваш ответ. Пробовал первый вариант, который был бы моей предпочтительной альтернативой. Появилась ошибка: 'PG :: Ошибка: ERROR: отсутствует запись FROM-clause для табличных« пользователей »: SELECT« comments ». * FROM« comments »WHERE« comments ».« Post.id »= 1 ORDER BY users.postcode ASC. Кажется, что опция заказа в ассоциации не выполняет внутреннее соединение? – migu

+0

можете ли вы отправить запрос? Пользователи должны быть в запросе, если вы хотите заказать «users.postcode» – Fon

+0

Это запрос, похоже, он не делает внутреннего соединения, и я не знаю, как я могу пройти во внутреннем соединении на has_many method: 'SELECT" comments ". * FROM" comments "WHERE" comments "." post_id "= 1 ORDER BY user.postcode ASC' – migu