Milk+ea

Weblog Is My Hobby.

Sequelのforeign_keyあたりの書き方

インサートするとき。

# coding: utf-8

require "pp"
require "sequel"
DB = Sequel.sqlite
Sequel::Model.plugin(:schema)

class Selector < Sequel::Model
  set_schema do
    primary_key :id
    string :name
  end
  create_table # class名の複数形

  one_to_many :properties # 別名 => has_many
end

class Property < Sequel::Model
  set_schema do
    foreign_key :selector_id, :selectors
    string :value
  end
  create_table

  many_to_one :selector # 別名 => belongs_to
end


Selector.import([:name],[
                ["header"],
                ["main"],
                ["footer"]])

header = Selector.first(name: "header")
main = Selector.first(name: "main")
footer = Selector.first(name: "footer")

header.add_property(value: "width: 100%")
main.add_property(value: "width: 960px")
main.add_property(value: "margin: 1em")
footer.add_property(value: "width: 100%")


 # 作られたテーブルの確認
p DB.tables # -> [:selectors, :properties]
# 関連してるテーブルの確認
p Selector.associations # -> [:properties]
p Property.associations # -> [:selector]

# 参照
Selector.all
        .each { |row| pp row.properties }
# ->
#  [#<Property @values={:selector_id=>1, :value=>"width: 100%"}>]
#  [#<Property @values={:selector_id=>2, :value=>"width: 960px"}>,
#   #<Property @values={:selector_id=>2, :value=>"margin: 1em"}>]
#  [#<Property @values={:selector_id=>3, :value=>"width: 100%"}>]

p Property.first(value: "width: 960px")
          .selector # -> <Selector @values={:id=>2, :name=>"main"}>

# 結果
pp Selector.all
# ->
# [#<Selector @values={:id=>1, :name=>"header"}>,
#  #<Selector @values={:id=>2, :name=>"main"}>,
#  #<Selector @values={:id=>3, :name=>"footer"}>]
pp Property.all
# ->
#  [#<Property @values={:selector_id=>1, :value=>"width: 100%"}>,
#   #<Property @values={:selector_id=>2, :value=>"width: 960px"}>,
#   #<Property @values={:selector_id=>2, :value=>"margin: 1em"}>,
#   #<Property @values={:selector_id=>3, :value=>"width: 100%"}>]

oneの方を1つ取ってきて、add_テーブル名の単数系メソッドで入れる!