Если (UserID, Дата) уникально, т.е. никакая дата не появляется дважды для того же пользователя тогда:
select TheTable.UserID, TheTable.Value
from TheTable inner join (select UserID, max([Date]) MaxDate
from TheTable
group by UserID) UserMaxDate
on TheTable.UserID = UserMaxDate.UserID
TheTable.[Date] = UserMaxDate.MaxDate;
@results1 = Table1.find(:all)
@results2 = Table2.find(:all)
@results3 = Table3.find(:all)
@combined_results_sorted_by_date_column =
(@results1 + @results2 + @results3).sort_by(&:date)
Что, если я хочу отсортировать по дате, но Таблица3 ссылается на столбец created_on как на дату?
class Table3
alias_method :date, :created_on
end
или просто
class Table3
alias date created_on
end
Вам, вероятно, не понравится этот ответ , но я бы сказал, что вы можете пересмотреть схему своей базы данных. Я был в похожей ситуации, и сортировка результатов после их объединения определенно не так, как вам хотелось бы.
Вы работаете не с «таблицами», а с объектами.
Если вы подумаете об этом таким образом, не будет смысла иметь:
@results1 = Users.find(:all)
@results2 = Posts.find(:all)
@results3 = Comments.find(:all)
Что бы "объединить" «форма означает?»
Вы, вероятно, захотите объединить результаты одного и того же вида с использованием разных «запросов». Это все?
Для истинного раскрывающегося списка для веб-форм asp.net нет свойства только для чтения.
<asp:DropDownList ID="DropDownList1" runat="server" Enabled="False">
</asp:DropDownList>
Если это не то, что вы делаете, вам нужно быть более конкретным. Вы не задали вопрос, вы не объяснили, ЧТО не работает, или не сказали, используете ли вы веб-формы или winforms, или это в коде позади или на странице aspx.
ETA: удалить только для чтения свойство из раскрывающегося списка, оно недействительно. ПОСЛЕ того, как вы протестируете эту часть и посмотрите, исправила ли она ее, если она по-прежнему не выполняет то, что вы хотите, сообщите нам, что она не делает. Это не отключение? Это не привязка к данным? Что с этим происходит?
Да, и убедитесь, что вы используете Bind, а не Eval, для шаблонов редактирования, если значение передается обратно каким-либо образом, например, при обновлении запроса. Иногда платформа делает это за кулисами,
@combined_results = @result1 + @result2 + @result3
@combined_results.sort! {|x,y| x.date <=> y.date}
Хотя это, безусловно, не самый эффективный код в мире, он может быть именно тем, что вам нужно.
Если в некоторых моделях нет метода даты, я предлагаю вам создать его. . Это так же просто, как.
def date
created_on
end
Я предполагаю, что вам нужен смешанный массив из трех разных типов объектов ActiveRecord, отсортированных по какой-то дате.
@array = (Bucket.all + Mop.all + Detergent.all).sort{|x,y| x.sort_by <==> y.sort_by}
Поскольку ваше поле sort_by отличается для каждого типа объекта, вы необходимо определить его.
class Bucket < ActiverRecord::Base
def sort_by
cleaned_on
end
end
class Detergent < ActiverRecord::Base
def sort_by
purchased_on
end
end
Вы можете собрать все данные, отсортированные в одном запросе, используя UNION, но вы не получите из этого объекты AR.
Я не уверен, каковы ваши объемы данных, но когда дело доходит до сортировки, ваша база данных справится с этим лучше, чем вы когда-либо использовали бы код "прикладного уровня".
. Нужны ли вам данные, возвращаемые в виде массива объектов модели, поскольку три таблицы, вероятно, сгенерируют смешанный массив из трех различных классов модели?
Почему бы не использовать прямой SQL, возвращающий строки и столбцы, и не поручить БД выполнять всю тяжелую работу по сортировке данных?