Как объединить объекты ActiveRecord?

Если (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;
8
задан Jim Puls 2 July 2009 в 18:39
поделиться

7 ответов

@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
14
ответ дан 5 December 2019 в 10:04
поделиться

Вам, вероятно, не понравится этот ответ , но я бы сказал, что вы можете пересмотреть схему своей базы данных. Я был в похожей ситуации, и сортировка результатов после их объединения определенно не так, как вам хотелось бы.

1
ответ дан 5 December 2019 в 10:04
поделиться

Вы работаете не с «таблицами», а с объектами.

Если вы подумаете об этом таким образом, не будет смысла иметь:

@results1 = Users.find(:all)
@results2 = Posts.find(:all)
@results3 = Comments.find(:all)

Что бы "объединить" «форма означает?»

Вы, вероятно, захотите объединить результаты одного и того же вида с использованием разных «запросов». Это все?

2
ответ дан 5 December 2019 в 10:04
поделиться

Для истинного раскрывающегося списка для веб-форм asp.net нет свойства только для чтения.

        <asp:DropDownList ID="DropDownList1" runat="server" Enabled="False">
    </asp:DropDownList>

Если это не то, что вы делаете, вам нужно быть более конкретным. Вы не задали вопрос, вы не объяснили, ЧТО не работает, или не сказали, используете ли вы веб-формы или winforms, или это в коде позади или на странице aspx.

ETA: удалить только для чтения свойство из раскрывающегося списка, оно недействительно. ПОСЛЕ того, как вы протестируете эту часть и посмотрите, исправила ли она ее, если она по-прежнему не выполняет то, что вы хотите, сообщите нам, что она не делает. Это не отключение? Это не привязка к данным? Что с этим происходит?

Да, и убедитесь, что вы используете Bind, а не Eval, для шаблонов редактирования, если значение передается обратно каким-либо образом, например, при обновлении запроса. Иногда платформа делает это за кулисами,

0
ответ дан 5 December 2019 в 10:04
поделиться
@combined_results = @result1 + @result2 + @result3
@combined_results.sort! {|x,y| x.date <=> y.date}

Хотя это, безусловно, не самый эффективный код в мире, он может быть именно тем, что вам нужно.

Если в некоторых моделях нет метода даты, я предлагаю вам создать его. . Это так же просто, как.

def date
  created_on
end
0
ответ дан 5 December 2019 в 10:04
поделиться

Я предполагаю, что вам нужен смешанный массив из трех разных типов объектов 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.

0
ответ дан 5 December 2019 в 10:04
поделиться

Я не уверен, каковы ваши объемы данных, но когда дело доходит до сортировки, ваша база данных справится с этим лучше, чем вы когда-либо использовали бы код "прикладного уровня".

. Нужны ли вам данные, возвращаемые в виде массива объектов модели, поскольку три таблицы, вероятно, сгенерируют смешанный массив из трех различных классов модели?

Почему бы не использовать прямой SQL, возвращающий строки и столбцы, и не поручить БД выполнять всю тяжелую работу по сортировке данных?

0
ответ дан 5 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: