Ruby on rails 在属于ActiveRecord关联的文件上使用through选项
有没有办法在归属关系中通过使用Ruby on rails 在属于ActiveRecord关联的文件上使用through选项,ruby-on-rails,ruby-on-rails-3,activerecord,ruby-on-rails-3.2,belongs-to,Ruby On Rails,Ruby On Rails 3,Activerecord,Ruby On Rails 3.2,Belongs To,有没有办法在归属关系中通过使用选项?没有提到通过作为选项,为什么不呢?我想做如下事情: class Lesson < ActiveRecord::Base attr_accessible :name, :lesson_group_id belongs_to :lesson_group belongs_to :level, through: :lesson_group end class LessonGroup < ActiveRecord::Base attr_ac
选项?没有提到通过
作为选项,为什么不呢?我想做如下事情:
class Lesson < ActiveRecord::Base
attr_accessible :name, :lesson_group_id
belongs_to :lesson_group
belongs_to :level, through: :lesson_group
end
class LessonGroup < ActiveRecord::Base
attr_accessible :name, :level_id
belongs_to :level
has_many :lessons
end
class Level < ActiveRecord::Base
attr_accessible :number
has_many :lesson_groups
end
class Lesson < ActiveRecord::Base
attr_accessible :name, :lesson_group_id
belongs_to :lesson_group
has_one :level, through: :lesson_group
end
class LessonGroup < ActiveRecord::Base
attr_accessible :name, :level_id
belongs_to :level
has_many :lessons
end
class Level < ActiveRecord::Base
attr_accessible :number
has_many :lesson_groups
end
课程
然后我可以做一些类似于Lesson.first.level
的事情。使用最新的稳定轨道(目前为3.2.9)。中给出了:
指定与另一个类的一对一关联。仅当此类包含外键时才应使用此方法
我认为您应该使用has\u one:level,through::lesson\u group
,如下所示:
class Lesson < ActiveRecord::Base
attr_accessible :name, :lesson_group_id
belongs_to :lesson_group
belongs_to :level, through: :lesson_group
end
class LessonGroup < ActiveRecord::Base
attr_accessible :name, :level_id
belongs_to :level
has_many :lessons
end
class Level < ActiveRecord::Base
attr_accessible :number
has_many :lesson_groups
end
class Lesson < ActiveRecord::Base
attr_accessible :name, :lesson_group_id
belongs_to :lesson_group
has_one :level, through: :lesson_group
end
class LessonGroup < ActiveRecord::Base
attr_accessible :name, :level_id
belongs_to :level
has_many :lessons
end
class Level < ActiveRecord::Base
attr_accessible :number
has_many :lesson_groups
end
课程
有关选项的文档中有一部分包含以下内容:
:通过
指定要通过其执行查询的联接模型。选项为:类名称、:主键和:外键
忽略,因为关联使用源反射。你只能
使用:通过在上具有关联或属于关联的
连接模型
他们在这里谈到了这一点:
在Rails 6
,Ruby 2.6
中,我遇到了一个类似的问题,我有一个用户
,可能属于许多组织
,但总是有一个主要组织
,这是他们被分配到的第一个组织
。最初,我使用以下方法设置此选项:
def primary_organization
organizations.first
end
然而,这最终打破了我的范围链。上述primary\u-organization
方法可以重构为可链接的条件,而无需更改用户。primary\u-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
# 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
# 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
组织机构\u用户.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
# 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
# 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
organization.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
# 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
# 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
@MrYoshiji-在has_one
下,Rails文档说,“只有当其他类包含外键时才应使用此方法。如果当前类包含外键,则应使用belish to.。”的文档中也有“Options:[…]-:through指定要通过其执行查询的联接模型。由于关联使用源反射,将忽略:class_name、:primary_key和:foreign_key的选项。您只能通过联接模型上的has_one或归属于关联使用:through查询。“这似乎没有意义。”<代码>课程
的属于:课程组
存在,因为它没有外键。类似地,LessonGroup
的属于:level
存在,因为它有外键。我会尝试这种方法,但不愿意依赖这种机制,即使它可以工作,因为文档中根本没有明确说明在这种情况下使用has_one
。我同意,这种情况不清楚。这可能会让您有点感兴趣:所属\u to:to C
不存在,因为当前表不包含指向C
的外键。