Belongs_to with conditions

Mam takie coś:

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 :slight_smile: )?

Ekosystem: Rails 5.1, Ruby 2.4.0, gem pg 0.20.0

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

Pozdrawiam

Całe:

class Accessorization < ApplicationRecord
  belongs_to :project
  belongs_to :user
  
  belongs_to :role, -> { only_not_special }
end

class Role < ApplicationRecord
  has_many :accessorizations
  scope :only_not_special, -> { where(special: false) }  
end

class Project < ApplicationRecord
  has_many :accessorizations
  has_many :users, :through => :accessorizations
end

class User < ApplicationRecord
  has_many :accessorizations
  has_many :projects, :through => :accessorizations
end

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’.

Zastanawiam się, czy nie jest związane z:

Problem:

scope scopem, walidacja walidacją

before_save :cry: wybór spory validate wygląda całkiem schludnie (w Accesorization na polu role_id z użyciem Twojego scope w warunku)

Pozdrawiam

No tak, aczkolwiek miałem nadzieję, że samo scope w belongs_to załatwia sprawę.