、、Rails 6
で、私は多くの人に属する可能性のあるを持っていたが、常に彼らが最初に割り当てられたものRuby 2.6
を持っていたという同様の問題に遭遇しました。もともと私はこれを次の方法で設定していました:User
Organizations
primary_organization
Organization
def primary_organization
organizations.first
end
しかし、それは最終的に私のスコープチェーンを壊しました。上記のメソッドは、構文primary_organization
を変更することなく、連鎖可能な条件にリファクタリングできます。user.primary_organization
user.rb
# has_many: OrganizationUsers > Organizations
# ==================================================================================
has_many :organization_users,
class_name: 'OrganizationUser',
inverse_of: :user,
dependent: :destroy,
autosave: true,
has_many :organizations,
class_name: 'Organization',
through: :organization_users,
inverse_of: :organization_users,
source: :organization
# *** ADDED IN REFACTOR ***
# has_one: Organization
# shortcut for:
# • `user.organization_users.first.organization`
# • `user.organizations.first`
# ==================================================================================
has_one :primary_organization_user,
-> {
order(
created_at: :desc
).limit(1)
},
class_name: 'OrganizationUser',
inverse_of: :user
has_one :primary_organization,
class_name: 'Organization',
through: :primary_organization_user,
inverse_of: :organization_users,
source: :organization
Organization_user.rb
# belongs_to: Organization
# ==================================================================================
belongs_to :organization,
class_name: 'Organization',
inverse_of: :organization_users
# belongs_to: User
# ==================================================================================
belongs_to :user,
class_name: 'User',
inverse_of: :organization_users
Organisation.rb
# has_many: OrganizationUsers > Users
# ==================================================================================
has_many :organization_users,
class_name: 'OrganizationUser',
inverse_of: :organization,
autosave: true,
dependent: :destroy
has_many :users,
class_name: 'User',
through: :organization_users,
inverse_of: :organization_users,
autosave: true