0

混乱の解決策を見つけようとしてからほぼ1週間が経ちました...ここにあります:

私はProgramモデルを持っています。私はProgramCategoryモデルを持っています。私はProgramSubcategoryモデルを持っています。

もっと明確にしましょう:

ProgramCategory ======> Shows, Movies, 
ProgramSubcategory ===> Featured Shows, Action Movies
Program ==============> Lost, Dexter, Game of Thrones etc...

これらの各モデルを相互に関連付けたいと考えています。特に多対多の関連付けでやりたいことがあります。categories_navigationJOIN モデル/テーブルがあり、他のすべてのテーブルがそれに接続されています。このようにして、これらすべてのモデルのすべてのフィールドにアクセスできます。

しかし...

ご存知のように、has_many :throughスタイルの関連付けは常に複数形です。has_one :through や belongs_to through などはありません。しかし、配列ではなく、特異なオブジェクトで遊びたいです。AProgramには ONLY ONESubcategoryと ONLY ONEがありCategoryます。結合テーブルを使用して、これら3つを接続するだけです。たとえば、現時点ではアクセスできますが、たとえば次program.program_categories[0].titleのようにアクセスしたいですprogram.program_category

'has_many :through's の機能を持ちながら、has_one の単数形の使用規則をまとめて使用するにはどうすればよいですか? :|

PS: 前回の質問もこの状況についてでしたが、ゼロから始めて、協会の哲学について学ぶことにしました。必要に応じて、私の以前の投稿を確認してください: How to access associated model through another model in Rails?

4

1 に答える 1

0

直接関係がある結合テーブルはなぜですか?最終的に、プログラムはサブカテゴリに属し、サブカテゴリは1つのカテゴリに属します。したがって、結合テーブルは必要ありません。

class Program < ActiveRecord::Base
  belongs_to :subcategory   # references the "subcategory_id" in the table
  # belongs_to :category, :through => :subcategory
  delegate :category, :to => :subcategory
end

class Subcategory < ActiveRecord::Base
  has_many :programs
  belongs_to :category    # references the "category_id" in the table
end

class Category < ActiveRecord::Base
  has_many :subcategories
  has_many :programs, :through => :subcategories
end

もう1つの観点は、カテゴリをツリーにすることです。したがって、「レベル2」カテゴリのモデルを追加する必要はなく、必要な数のレベルを追加できます。「closure_tree」のようなツリー実装を使用する場合は、すべてのサブカテゴリ(任意のレベル)、すべてのスーパーカテゴリなどを取得することもできます

その場合、サブカテゴリモデルはスキップします。これは、depth=2のカテゴリにすぎないためです。

class Program < ActiveRecord::Base
  belongs_to :category   # references the "category_id" in the table

  scope :in_categories, lambda do |cats|
    where(:category_id => cats)  # accepts one or an array of either integers or Categories
  end
end

class Category < ActiveRecord::Base
  acts_as_tree
  has_many :programs
end

ツリーを使用してカテゴリでフィルタリングする方法のほんの一例。選択ボックスがあり、そこからカテゴリを選択するとします。カテゴリだけでなく、そのサブカテゴリに対応するすべてのオブジェクトを取得する必要があります。

class ProgramsController < ApplicationController

  def index

    @programs = Program.scoped
    if params[:category].present?
      category = Category.find(params[:category])
      @programs = @programs.in_categories(category.descendant_ids + [category.id])
    end

  end

end

ツリーウィン!

于 2012-09-28T16:08:09.983 に答える