Ответ 1
Вы можете заказать в связанной таблице, введя вложенное соединение, например:
@posts = Post.joins(:user => :friendships).order("friendships.friended_at")
У меня странный сценарий: я хотел бы заказать все сообщения P к тому моменту, когда подружился создатель P и текущий пользователь.
Результатом будет список сообщений с сообщениями новых друзей в сообщениях верхнего и старшего друзей внизу. Мы можем предположить, что все пользователи являются друзьями всех других пользователей, но каждая дружба имеет разные времена создания.
У меня есть модели Post, User и Friendship. Сообщения принадлежат пользователям, а пользователи имеют много дружеских отношений.
class User < ActiveRecord::Base
has_many :friendships
has_many :friends, :through => :friendships
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
has_many :inverse_friends, :through => :inverse_friendships, :source => :user
end
class Friendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, :class_name => "User"
end
class Post < ActiveRecord::Base
belongs_to :user
end
Какой лучший способ сделать это? Спасибо!
Вы можете заказать в связанной таблице, введя вложенное соединение, например:
@posts = Post.joins(:user => :friendships).order("friendships.friended_at")
Поверните Шон Хилл в область действия с помощью:
class Post < ActiveRecord::Base
belongs_to :user
scope :ordered, -> {
joins(:user => :friendships).order("friendships.friended_at")
}
end
Просто добавление к этому, как спасибо, ответ Шона Хилла также немного изменен, чтобы сортировать результаты, используя has_many через отношения с полями в Rails 4.
Таким образом, если сообщения принадлежат _ как для разговоров, так и для пользователей, и сначала вам нужен список разговоров на странице "Пользователь", возможно, до обновления или изменения некоторого атрибута сообщения, но отсортированного по атрибуту "Беседы" (например, "название" ), а не "Сообщения", вы можете перейти от атрибутов "Пользователь через сообщения" к "Беседы" и "Беседа".
В представлении:
<% fields_for :messages, @user.messages.joins(:conversation).order("title ASC") do %>
или в модели User.rb:
has_many :messages, -> {joins(:conversation).order("title ASC")}