throughとsourceに関してわからないということで追記です
throughは「2つのテーブルのレコードががm個:n個で関連している」場合に、中間テーブルを用いて関連付けするときに使います
例えば、製品を管理するProductモデルと製品の分類を行うCategoryモデルがあるとします。
productsテーブルの製品である「リンゴ」は、「果物」と「新鮮」というCategoryに分類されています
productsテーブルの別の製品である「みかん」は、「果物」と「柑橘系」というCategoryに分類されています
このとき、productsテーブルのレコード1つに対して、複数のcategoriesテーブルのレコードが関係していますね?また、categoriesテーブルのレコード「果物」に対しても、「リンゴ」・「みかん」のふくすうレコードが関係しています。
この場合「productsテーブルとcategoriesテーブルのレコードがm:nで関連している」といいます
では「中間テーブル」とは何か。これは、「リンゴ」に対して関連する「果物」と「新鮮」というレコードの関連だけを保持しておくテーブルです。このテーブルには、「リンゴ」「果物」というレコードと、「リンゴ」「新鮮」というレコードが別のレコードとして保存されます。ただし、全ての情報を持つのは効率的ではないため、識別するためのラベルみたいなものとしてid情報だけを保持しておきます
中間テーブルの名前をまぁ適当に"chukans"とでもしておきます。この時、モデル・テーブルの構成は以下みたいな感じです
ruby
1Productモデル
2has_many :chukans
3has_many :categories ,through: :chukans
4
5Categoryモデル
6has_many :chukans
7has_many :categories ,through: :chukans
8
9Chukanモデル
10belongs_to :product
11belongs_to :category
Product - Chukan - Category と関連付けたいので、through: :chukansとしてあげます
ProductとCategoryは複数対複数の関係にあるので、お互いをhas_manyで関連付けます
ChukanはProductとは1対複数、Categoryとも1対複数の関係にあるので、belongs_toで関連付けます
ruby
1###productsテーブル###
2id:integer
3name:string #適当な情報として、製品の名前を持つものとします
4
5###categoriesテーブル###
6id:integer
7name:string #適当な情報として、製品の名前を持つものとします
8
9###chukansテーブル###
10id:integer
11products_id:integer #このidで関連するproductsを識別します
12category_id:integer #このidで関連するcategoriesを識別します
13
これで、適当なproductsインスタンス@productsに関連するcategoriesは以下で取得できます
ruby
1@product = Product.find(1) #例えばid=1のproduct {id: 1, name: "リンゴ"}
2@categories = @product.categories #関連するCategoryレコード全部を得られる [{id: 1,name: "果物"},{id: 2, name: "新鮮"}]
さて、sourceですが、そろそろ説明を繰り返すのに疲れたので参考サイト探してきました。
偉大なる先駆者様に感謝
http://www.coma-tech.com/archives/223/
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/12 06:35