在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
organization.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