направляющие has_many: через has_many: через

Я задаюсь вопросом, до какой степени я могу использовать ассоциации в направляющих. Учтите следующее:

class User < ActiveRecord::Base
    has_one :provider
    has_many :businesses, :through => :provider
end

class Provider < ActiveRecord::Base
    has_many :businesses
    has_many :bids, :through => :businesses
    belongs_to :user
end

class Business < ActiveRecord::Base
    has_many :bids
    belongs_to :provider
end

class Bid < ActiveRecord::Base
    belongs_to :business
end

Я могу настроить эти изящные ярлыки как User.businesses и Provider.bids но что относительно того, чтобы делать что-то как User.bids? Действительно ли возможно связать ассоциацию, так сказать?

11
задан user2262149 23 September 2018 в 17:19
поделиться

4 ответа

Это совершенно возможно, но нуждается в небольшой дополнительной работе. Следующие образцовые определения использовали в сочетании с nested_has_many плагин , можно выбрать все предложения, принадлежащие пользователю со всего , @user.bids

class User < ActiveRecord::Base
    has_one :provider
    has_many :businesses, :through => :provider
    has_many :bids, :through => :businesses
end

class Provider < ActiveRecord::Base
    has_many :businesses
    has_many :bids, :through => :businesses
    belongs_to :user
end

class Business < ActiveRecord::Base
    has_many :bids
    belongs_to :provider
end

class Bid < ActiveRecord::Base
    belongs_to :business
end

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

4
ответ дан 3 December 2019 в 10:26
поделиться

Если вы просто хотите получить записи, почему бы не использовать использование #Delegate ? Работает просто отлично, по крайней мере, в сценарии, который вы описали.

class User < ActiveRecord::Base
    has_one :provider
    delegate :bids, :to => :provider
end

class Provider < ActiveRecord::Base
    has_many :businesses
    has_many :bids, :through => :businesses
    belongs_to :user
end

class Business < ActiveRecord::Base
    has_many :bids
    belongs_to :provider
end

class Bid < ActiveRecord::Base
    belongs_to :business
end

Хотя в моем не так скромном мжении вы должны просто церовать методы, потому что это более просто, и вы больше не достигаете повышения производительности, если вы не пойдете с сумасшедшим пользовательским SQL, как говорит Тадман.

4
ответ дан 3 December 2019 в 10:26
поделиться

Я бы проверил, статически ли вы связываете библиотеки в режиме выпуска и динамически связываете ли их в режиме отладки. Например, можно статически связать среду выполнения C++.

-121--4294071-

Вы можете просмотреть java doc по адресу http://bouncycastle.org/docs/docs1.6/index.html

Вы можете скачать примеры с этой страницы: http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0764596330, descCd-DOWNLOAD.html

-121--2797465-

Хотя это очень полезная вещь, чтобы иметь, вы не можете has_many:through has_many:through отношения. Это ограничение механизма соединения.

Альтернативой является либо использование умного подвыбора, либо в данном случае подвыбора, либо преднамеренная денормализация таблиц, достаточная для уменьшения глубины соединения.

Например, поскольку Бизнес определяется в контексте Поставщика, это означает, что любые элементы Предложения также косвенно присваиваются Поставщику. Создание прямой связи между Заявкой и Поставщиком сделает запрос предложений напрямую простым.

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

Там нет ничего останавливая, что вы делаете что-то вроде этого AFAIK:

class User < ActiveRecord::Base
    has_one :provider
    has_many :businesses, :through => :provider

    def bids
        user_bids = []
        businesses.each |business| do
            user_bids += business.bids
        end
        user_bids
    end
end

class Provider < ActiveRecord::Base
    has_many :businesses
    has_many :bids, :through => :businesses
    belongs_to :user
end

class Business < ActiveRecord::Base
    has_many :bids
    belongs_to :provider
end

class Bid < ActiveRecord::Base
    belongs_to :business
end

, затем вызов @ user.bids должен производить желаемый результат, вы также можете кэшировать предложения и делать другие модульные вещи, если ты хочешь.

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

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