3

throughBelongs_to関係でオプションを使用する方法はありますか?職員のbelongs_toに関するRailsのドキュメントにthroughは、オプションとして記載されていません。私は次のようなことをしたいです:

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

その後、私はのようなことをすることができますLesson.first.level。最新の安定したRailsを使用しています(現在は3.2.9)。

4

2 に答える 2

5

あなたが与えたリンクで:

別のクラスとの1対1の関連付けを指定します。このメソッドは、このクラスに外部キーが含まれている場合にのみ使用する必要があります。

has_one :level, through: :lesson_group次のように、を使用する必要があると思います。

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

オプションに関するドキュメントの一部has_one

:終えた

クエリを実行するための結合モデルを指定します。関連付けはソースリフレクションを使用するため、:class_name、:primary_key、および:foreign_keyのオプションは無視されます。:throughクエリは、結合モデルのhas_oneまたはbelongs_toアソシエーションを介してのみ使用できます。

彼らはここでそれについて話しました: Rails has_one:throughassociation

于 2012-12-06T17:57:46.353 に答える
0

、、Rails 6で、私は多くの人に属する可能性のあるを持っていたが、常に彼らが最初に割り当てられたものRuby 2.6を持っていたという同様の問題に遭遇しました。もともと私はこれを次の方法で設定していました:UserOrganizationsprimary_organizationOrganization

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
于 2021-03-11T18:24:58.900 に答える