redmine 読み (9)
app/models/project.rb 確認します。しばらくは上から順にググりつつ、な方向で。
has_many
project なレコード 1 件に対して n 件のレコードがあるよ、という事になるはず。例えば以下な記述であれば
has_many :time_entry_activities
複数の time_entry_activity.rb なオブジェクトが存在する。最近は belongs_to みたいな記述は無くなったのかな。time_entry_activity.rb 側にはそういった記述が存在しない。とりあえず冗長なので、という理解でスルーしよう。
次、以下な記述。長い。
has_many :members, :include => [:principal, :roles], :conditions => "#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE}"
- include は [http
- //railsdoc.com/references/has_many:title=Rails ドキュメント has_many] 曰く、_関連モデルクラスのオブジェクトをロードする際、同時に読み込みたいモデルを指定 (Rails ドキュメント has_many より引用)_とのことで member.rb を確認してみると以下な定義。
class Member < ActiveRecord::Base belongs_to :user belongs_to :principal, :foreign_key => 'user_id' has_many :member_roles, :dependent => :destroy has_many :roles, :through => :member_roles
belongs_to はまだ生きてるんですね。まぁ当り前か。で、conditions は何かというと project に対して複数の member があり得て、principal も同様に、なんですが principal をチョイスする条件が書かれてる、という理解で良いのかなぁ。
ちなみに role は member から見て has_many なので全部持って来い、と。member と role の関係は多対多になるのかどうか。
あ、belongs_to は元をひっぱってくる必要がある時に指定するのか。なんちゃら_id てきソレが必要な時とか。
ええと、ruby/rails/RailsGuidesをゆっくり和訳してみたよ/Active Record Associations によれば_関連先のオブジェクトが満たす必要がある制約を指定する_とのこと。いいのかな。てかこのドキュメント確認しておく必要ありますね。
次を見てみます。class_name はクラス名指定なんですね。Membership というクラスは確かにないですね。
has_many :memberships, :class_name => 'Member'
関連に名前を付ける時に model クラスの名前をそのまんま使えれば良いのだけれど複数のケイスがあり得る場合はこうしないと微妙なのかどうか。
Member 由来の関連付けがもう一つあります。
has_many :member_principals, :class_name => 'Member', :include => :principal, :conditions => "#{Principal.table_name}.type='Group' OR (#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE})"
ちなみに Member クラスの記述ですが
class Member < ActiveRecord::Base belongs_to :user belongs_to :principal, :foreign_key => 'user_id'
という形になってて、関連付けるためのカラムは user_id になりますよ、という事なのか。これ、model なナニをマンガにすると凄い量になりそうだなぁ。
もう一つ。
has_many :users, :through => :members
これは project と user が多対多になる、という事なのか。日本語にしてみるとそりゃそうだわな、と思ってしまいます。ちなみに db/scheme.rb 見てみるに以下な記述。
create_table "members", :force => true do |t| t.integer "user_id", :default => 0, :null => false t.integer "project_id", :default => 0, :null => false t.datetime "created_on" t.boolean "mail_notification", :default => false, :null => false end
id のみで紐付けてるカンジですね。