Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在属于ActiveRecord关联的文件上使用through选项_Ruby On Rails_Ruby On Rails 3_Activerecord_Ruby On Rails 3.2_Belongs To - Fatal编程技术网

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
的外键。