Как я могу смешать 2 модели рельсов в одну находку? - PullRequest
3 голосов
/ 22 июля 2010

У меня есть две модели, которые не связаны (в смысле БД), но имеют некоторые общие столбцы (имя, адрес электронной почты и т. Д.).

Class Account < ActiveRecord::Base

end


Class LegacyAccount < ActiveRecord::Base

end

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

Можно ли выполнить поиск / запрос из обеих моделей? Или я могу сделать два поиска и объединить полученные массивы, чтобы они были отсортированы? Могу ли я использовать некоторую промежуточную модель для объединения обоих?

Ответы [ 4 ]

6 голосов
/ 22 июля 2010

Самое простое решение - просто объединить массивы, а затем просто использовать Array методы сортировки некоторого вида:

@accounts = (LegacyAccount.all + Account.all).sort{|x,y| x.name <=> y.name}

Возможно, вы могли бы написать собственный метод поиска в вашей модели Account, чтобы сделать этопроще, так что вы можете просто позвонить Account.find_all или что-то еще.


Существует еще одно возможное решение с использованием SQL:

@accounts = Account.find_by_sql("SELECT * FROM accounts UNION SELECT * FROM legacy_accounts")

, которое работает в терминах чистого SQL, но яне уверен насчет Rails.Я предполагаю, что он будет обрабатывать все LegacyAccounts, как если бы они были обычными учетными записями.Я не уверен, что произойдет, если в LegacyAccounts есть столбцы, которых нет в Accounts.

В качестве альтернативы вы можете попробовать кое-что отсюда: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html

Последние 2 решения сложнытак что я бы попробовал их, только если ты имеешь в виду что-то очень конкретное.

1 голос
/ 09 июля 2014

Вот только мои 2 цента, которые я использовал для RSS-канала сайта:

(Model1.latest + Model2.latest).sort_by(&:created_at).reverse
1 голос
/ 22 июля 2010

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

class AccountView
  def self.find_all
    accounts = []
    Account.find(:all).each do |account|
      accounts << {:name => account.name, ... }
    end
    LegacyAccount.find(:all).each do |account|
      accounts << {:name => account.name, ... }
    end
    return accounts
  end
end

Или определите атрибуты на AccountView и верните массив AccountView объектов.

0 голосов
/ 22 июля 2010
@accounts = Account.find(:all, :include => :legacy_account)

или стиль соединения Rails3

@accounts = Account.all.joins(:legacy_account)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...