ActiveRecord и загрузка данных из связанных таблиц - PullRequest
0 голосов
/ 17 сентября 2009

Моя модель выглядит так (пример):

class Bank < ActiveRecord::Base
  has_and_belongs_to_many :currencies
  # other stuff
end

Когда я хочу получить какой-нибудь банк из базы данных, я делаю:

bank = Bank.first :joins => :some_table,
         :conditions => {
           #some conditions
         }

Теперь, есть ли способ явно извлекать валюты из базы данных для заданных условий, сортировать их в некотором порядке и сохранять в bank.currencies ?

Я делаю что-то вроде этого:

bank.currencies.reject! { |c| c.value < something }
bank.currencies.sort! { |x,y| x.value <=> y.value }

Это работает, но таким образом я извлекаю все записи и фильтрую их самостоятельно. Я хотел бы, чтобы СУБД сделала это для меня.

Это просто пример с банками и валютами. У меня есть большие записи, и я думаю, что важно просто найти те, которые меня интересуют.

Ответы [ 2 ]

1 голос
/ 17 сентября 2009

Вы можете использовать предложения "find" для отношений, например:

bank.currencies.find(:all, :conditions => {something}, :order => {something})

или, если вы предпочитаете:

bank.currencies.all(:conditions => {something}, :order => {something})

Должны быть доступны все стандартные параметры ActiveRecord - например, лимит, порядок и т. д.

Конечно, если вы обнаружите, что повторно используете логику запроса, вы можете объявить именованные области в модели Currency - скажем, 'with_count_greater_than' и 'in_order' - и затем объединить их в цепочку:

bank.currencies.with_count_greater_than(10).in_order

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

1 голос
/ 17 сентября 2009

Может тебе это поможет?

bank = Bank.first
concurrencies = Concurrency.find(:all, :conditions => {:bank => bank}, :order => "position desc")

Или вы можете изменить модель своего банка

def Bank << AR
  has_many :concurrencies

  def ordered_concurrencies
    Concurrency.for_bank(self)
  end
end

def Concurrency << AR
  belongs_to :bank

  named_scope :for_bank, lambda { |*args| {:conditions => {:bank => args.first}, :order => "position desc"} }
end

Чтобы вы могли позвонить

Bank.first.ordered_concurrencies

и получите заказанный параллелизм как ActiveRecord-Collection.

Помимо этого, с помощью этого решения вы можете добавить и другие условия:

Bank.first.ordered_concurrencies.find(:all, :conditions => ["name like ?", "Dollar"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...