Рельсовые Ассоциации - PullRequest
       1

Рельсовые Ассоциации

0 голосов
/ 17 июня 2011

У меня есть приложение Rails 2.3.11, которое имеет две ключевые модели:

  • Активность
    • Транзакция

Livesite: http://iatidata.heroku.com
Github: https://github.com/markbrough/IATI-Data

Каждая транзакция вкладывается в действие.Каждое действие имеет несколько транзакций.

Я думаю, что я запутался в том, как работают ассоциации в Rails, но, возможно, то, что я пытаюсь сделать, невозможно.

По сути, я хочуполучить общую стоимость транзакций всех видов деятельности, которые принадлежат каждой стране.Так сколько денег ушло в Индию, сколько в Афганистан и т. Д.

Это работает:

@thiscountry_activities.each do |a|
    @thiscountry_value = @thiscountry_value + a.transactions.sum(:value)
end

Но это не работает:

@thiscountry_value = @thiscountry_activities.transactions.sum(:value)

Этовыдает эту ошибку:

undefined method `transactions' for #<Array:0xb5670038>

@ thiscountry_activities определяется следующим образом:

@activities = Activity.find(:all, :conditions=> @conditions)

Это помещается в цикл, который получает код страны каждого получателя.@ условия:

@conditions[:recipient_country_code]=*each recipient country code, e.g. AF*

Похоже, у меня какая-то проблема с ассоциацией.Вот как настраиваются модели:

class Transaction < ActiveRecord::Base
    belongs_to :activity
end

class Activity < ActiveRecord::Base
    has_and_belongs_to_many :policy_markers
    has_and_belongs_to_many :sectors
    has_many :transactions
end

Я думаю, что это, вероятно, довольно простая проблема, но я не могу понять, что происходит.Две модели связаны друг с другом через id (в Activity) и activity_id (в транзакциях).

Спасибо!

1 Ответ

0 голосов
/ 17 июня 2011

Ничего не нарушено, метод find в Rails2 возвращает массив - и в классе Array отсутствует метод transactions. Используйте первое, что у вас работает, с итератором each, или работайте с другой стороны - из Transaction и группируйте по действиям. Я давно не писал код на Rails2, но это будет примерно так:

Transaction.all( :select => "activity_id, SUM(value) AS total", :group => 'activity_id' )

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...