class CreateAccessorizations < ActiveRecord::Migration[5.1]
def change
create_table :accessorizations do |t|
t.integer :project_id
t.integer :role_id
t.integer :user_id
t.integer :powers, null: false
t.timestamps
end
end
end
class Role < ApplicationRecord
has_many :accessorizations
scope :only_not_special, -> { where(special: false) }
end
class Accessorization < ApplicationRecord
belongs_to :role, -> { only_not_special }
end
…i gdy robię rails db:seed, w którym mam:
user = User.create(...)
project = Project.create(....)
role = Role.create(...., special: true)
a = project.accessorizations.create(user: user, role: role)
…to nie wysypuje się!
Tworzy rekord w accessorizations, notomiast, gdy później robię a.roles to pokazuje nil (oczywiście sprawdziłem, że w tabeli jest prawidłowe ‘role_id’
Jak wymusić kontrolę belongs_to w czasie dodawania rekordów (poza oczywistym pisaniem procedury before_save )?
W ‘a’ masz obiekt Accessorization, który ma wiązanie z rolą:
Przy tym wiązaniu masz tylko do dyskozycji a.role. Accessorization może mieć tylko 1 rolę. Chcąc uzyskać liczbę mnogą ‘roles’ zmień typ wiązania na has_and_belongs_to_many lub has_many … through
a.roles jest OK.
Pokazuje wiązania dla obiektów role, które spełniają { only_not_special }
Mój problem polega na tym, że w czasie dodawania rekordów nie ma walidacji tego scope i przyjmuje role_id również dla ról, które są ‘special’ i nie są ‘special’. Zwyczajnie ignoruje ‘scope’ na etapie ‘create new record’.