Рельсы - build_association не работают на has_one и belongs_to отношения

У меня есть две модели

class Subscription < ActiveRecord::Base
  belongs_to :client
end

class Client < ActiveRecord::Base
  has_one :subscription
end

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

>> sub = Subscription.new
=> #<Subscription id: nil, token: nil, user_id: nil, created_at: nil, updated_at: nil, cancelled: nil, active: nil, client_id: nil>
>> sub.save(false);
?> client = sub.build_client
=> #<Client id: nil, server_id: nil, ip: nil, created_at: nil, updated_at: nil>
>> client.save(false)
=> true
>> sub.client_id
=> nil
>> sub
=> #<Subscription id: 4, token: nil, user_id: nil, created_at: "2010-01-11 06:07:45", updated_at: "2010-01-11 06:07:45", cancelled: nil, active: nil, client_id: nil>

Это действительно работает, если я делаю клиента build_subscription

?> client = Client.new
=> #<Client id: nil, server_id: nil, ip: nil, created_at: nil, updated_at: nil>
>> client.save(false)
=> true
>> sub = client.build_subscription
=> #<Subscription id: nil, token: nil, user_id: nil, created_at: nil, updated_at: nil, cancelled: nil, active: nil, client_id: 4>
>> sub.save(false)
=> true
>> sub
=> #<Subscription id: 5, token: nil, user_id: nil, created_at: "2010-01-11 06:09:32", updated_at: "2010-01-11 06:09:32", cancelled: nil, active: nil, client_id: 4>
>> client
=> #<Client id: 4, server_id: nil, ip: nil, created_at: "2010-01-11 06:09:02", updated_at: "2010-01-11 06:09:02">
>> ^C

Я провел 3 часа, играя и стал нигде не быстрым. Может любой объяснять, что я делаю неправильно, вещи проверить и т.д.

9
задан John Topley 11 January 2010 в 07:48
поделиться

3 ответа

В соответствии с вашими модельными ассоциациями Подписка является дочерним предприятием клиента .

Если вы сначала создаете подписку, а затем клиента в соответствии с вашим первым примером, у Rails нет возможности установить значение иностранного ключа client_id в таблице subscriptions, потому что в этот момент вы не создали клиентскую запись, так что нет ничего, что могло бы ассоциироваться с подпиской. Поэтому вы должны сначала создать родительскую запись (т.е. клиент), а затем связать её с дочерней записью подписки, используя метод build_subscription.

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

Это не работает как способами, родитель может построить ребенка с методом Build_Association, но не наоборот.

Читайте: http://apidock.com/rails/activerecord/sascations/Classmethods/has_one

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

Краткая версия: line-height: 150% статическая, line-height: 1,5 динамическая. Эффект более очевиден для наследующих элементов. Пример:

HTML

<div style="font-size: 12px">
    <span style="font-size: 24px">test</span>
</div>

Этот CSS

div { line-height: 150%; } /* Computed line-height: 18px (150% * 12px) */
span { }                   /* Computed line-height: 18px (inherited directly) */

В противоположность этому:

div { line-height: 1.5 }   /* Computed line-height: 18px (1.5 * 12px) */
span { }                   /* Computed line-height: 36px (1.5 * 24px) */

Вы можете прочитать больше на странице CSS2 спецификации

-121--2439260-

Блог об этом в моем блоге :) Короткая версия, чтобы найти полные названия ресурсов (если вы уже не знаете их):

var assembly = Assembly.GetExecutingAssembly();

foreach (var resourceName in assembly.GetManifestResourceNames())
    System.Console.WriteLine(resourceName);

Чтобы использовать все их для чего-либо:

foreach (var resourceName in assembly.GetManifestResourceNames())
{
    using(var stream = assembly.GetManifestResourceStream(resourceName))
    {
        // Do something with stream
    }
}

Чтобы использовать ресурсы в других сборках, кроме выполняющейся, можно просто получить другой объект сборки, используя некоторые другие статические методы класса Assembly . Надеюсь, это поможет:)

-121--2034716-

В моих проектах есть много похожих связей, но я часто запрещаю устанавливать для client_id значение null, поэтому не могу создать дочерний объект без родительского объекта.

Попробуйте

sub = Subscription.new
sub.build_client
sub.save

Создать и сохранить оба объекта.

1
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

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