2

更新 (具体的で詳細な以前のバージョンは以下にあります):

私はテレビ局のウェブサイトを開発しています。私のプログラムセクションの要件は次のとおりです。

  1. それぞれProgramに ONE がありCategoryます。
  2. それぞれProgramに ONE がありSubcategoryます。
  3. それぞれCategoryに多くのSubcategories
  4. それぞれCategoryに MANY がありProgramsます。
  5. それぞれSubcategoryに1つCategory
  6. それぞれSubcategoryに MANYがありProgramます。

関連付けるこれら 3 つのモデルをすべて取得したいと考えています。たとえば、ビューから以下のデータを取得できるはずです。

その間:

p = Program.find(1)
p_cat = ProgramCategory.find(1)
p_subcat = ProgramSubcategory.find(1)

これらを取得して編集できるはずです。

p.program_category
p.program_subcategory

また

program_category.programs
program_subcategory.programs

これらの要件を達成するために私が試したことを以下に示します。まったく別の方法を勧めたり、間違いを修正したりするかもしれません。

ありがとうございました

================================================== ==========

私は3つのモデルを持っています。それらは互いに入れ子になっているはずです。

ProgramCategory > ProgramSubcategory > プログラム

ここに私のコードがあります:

ProgramCategory モデル:

 has_many :programs
 has_many :program_subcategories

ProgramSubcategory モデル:

belongs_to :program_category
has_many :programs

プログラム モデル:

belongs_to :program_category
belongs_to :program_subcategory

新しいプログラムを作成すると、そのカテゴリを設定でき、すべて問題ありません。両側からアクセスできます。例えば、

program.program_category

私が期待したものを私に与えます。そしてまた

program_category.programs

私が欲しいものも与えてくれます。

しかし、 -ここで質問があります-

にアクセスしようとするとprogram.program_subcategory、何も表示されません。

サブカテゴリのカテゴリが設定され、プログラムのカテゴリも設定されているのに、program.program_subcategory直接アクセスできないのはなぜですか?

と入力するとprogram_category.program_subcategories、そのカテゴリが所有するすべてのサブカテゴリが表示されます。Programしかし、オブジェクトから直接サブカテゴリを取得することはできません。

私のスキームは以下です。どんな助けでも感謝します。

ActiveRecord::Schema.define(:version => 20120926181819) do

  create_table "program_categories", :force => true do |t|
    t.string   "title"
    t.text     "content"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "program_subcategories", :force => true do |t|
    t.integer  "program_category_id"
    t.string   "title"
    t.text     "content"
    t.datetime "created_at",          :null => false
    t.datetime "updated_at",          :null => false
  end

  add_index "program_subcategories", ["program_category_id"], :name => "index_program_subcategories_on_program_category_id"

  create_table "programs", :force => true do |t|
    t.integer  "program_category_id"
    t.integer  "program_subcategory_id"
    t.string   "title"
    t.text     "content"
    t.datetime "created_at",             :null => false
    t.datetime "updated_at",             :null => false
  end

  add_index "programs", ["program_category_id", "program_subcategory_id"], :name => "my_join1", :unique => true

end
4

1 に答える 1

2

ちょっと変わったデザインです。次のようなネストが必要な場合

ProgramCategory > ProgramSubcategory > Program

それならあなたが必要です

class Program < ActiveRecord::Base
  belongs_to :program_subcategory
end

class ProgramSubcategory < ActiveRecord::Base
  belongs_to :program_category
  has_many :programs
end

class ProgramCategory < ActiveRecord::Base
 has_many :programs, :through => :program_subcategories
 has_many :program_subcategories
end

このようにして、プログラムを作成するときにサブカテゴリを割り当てることができます。このサブカテゴリは既にカテゴリに割り当てられているため、次の方法でアクセスできますprogram.program_subcategory.program_category

また、プログラムはカテゴリに直接接続されているのではなく、サブカテゴリを介して接続されているためprogram_category_id、外部キーは必要ありません。programs


アップデート

  1. 各プログラムには 1 つのカテゴリがあります。
  2. 各プログラムには 1 つのサブカテゴリがあります。
  3. 各カテゴリには多数のサブカテゴリがあります
  4. 各カテゴリーには多くのプログラムがあります。
  5. 各サブカテゴリには 1 つのカテゴリがあります
  6. 各サブカテゴリには多くのプログラムがあります。

それなら、私の答えはまだ有効だと思います。ほら、私の構造はあなたの説明と同じですEach Program has ONE Category(レールには がないためbelongs_to through)。あなたhas oneは実際にそうですbelongs_to(それは1つだけに属することができるため).

Each Program has ONE Subcategoryしかし、Each Subcategory has ONE Categoryプログラムのサブカテゴリのカテゴリが唯一のプログラムのカテゴリになるとすぐに。p.program_categoryProgram クラスでメソッドを定義することで、次のことができます。

def program_category
  program_subcategory.program_category
end

今の部分のために

これらを取得して編集できるはずです。

p.program_category

カテゴリ映画のサブカテゴリコメディの番組があるとします。

次のように、プログラムカテゴリを直接編集できるようにしたいと言います(私が正しく理解していれば):

p.program_category = ProgramCategory.find_by_name("Sports")

しかし、その場合、プログラムのサブカテゴリは何になると思いますか? スポーツに多くのサブカテゴリがあるとすぐに?空白になると思いますか?

したがって、この設計では、プログラムのカテゴリを変更する唯一の方法は、プログラムのサブカテゴリを変更することです。

p.program_subcategory = ProgramSubcategory.find_by_name("Tennis")

テニスはスポーツに属しているため、これはプログラムのカテゴリ == スポーツを管理します。

注:プログラムのカテゴリを直接変更したい場合、サブカテゴリを空白のままにしておくと、もちろん別の設計が必要になります。非常に難しいとは思いませんが、Rails AR Associations マジックの助けを借りずに、より多くの作業が必要です。

于 2012-09-26T20:08:39.113 に答える