4

私は DataMapper を使い始めたばかりで、 ahasと aを指定する必要がある理由を理解しようとしていますbelongs_to

たとえば、DataMapper Web サイトの例を見てください。これは冗長ではありませんか?コメントを投稿has nすると、コメントは自動的にbelongs_to投稿されませんか? なぜこれを指定する必要があるのですか?

class Post
  include DataMapper::Resource

  property :id, Serial

  has n, :comments
end

class Comment
  include DataMapper::Resource

  property :id,     Serial
  property :rating, Integer

  belongs_to :post  # defaults to :required => true

  def self.popular
    all(:rating.gt => 3)
  end
end
4

3 に答える 3

7

余分な指定によって生成されたメソッドを使用する場合にのみ、関係の両側を指定します。完全にオプションです: から にアクセスする必要がない場合Post(Comment例: )、 でリレーション@comment.postを指定する必要はありません。belongs_toComment

Comment1 つの利点は、追加のメソッドが自動生成されないため、インスタンスが少しクリーンになることです。一方、それらが必要な場合は、それらの追加のメソッドは気にしません。

ActiveRecord の関連付けに関するドキュメントも参照してください。

于 2011-09-06T16:00:18.943 に答える
0

これらの良い答えに追加したいのですが、dm-constraints(直接または経由でdata_mapper) を必要としauto_migrate!、を使用するbelongs_toと、データベース レベルで外部キー制約が自動的に追加されますが、has単独ではこれは行われません。

例えば:

require 'data_mapper'

class Post
  include DataMapper::Resource
  property :id, Serial
end

class Comment
  include DataMapper::Resource
  property :id, Serial

  belongs_to :post
end

これを生成します (MySQL アダプター経由):

 ~ (0.140343) CREATE TABLE comments (id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
post_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB
CHARACTER SET utf8 COLLATE utf8_general_ci

 ~ (0.234774) CREATE INDEX index_comments_post ON comments (post_id)

 ~ (0.433988) ALTER TABLE comments ADD CONSTRAINT comments_post_fk
FOREIGN KEY (post_id) REFERENCES posts (id) ON DELETE NO ACTION ON UPDATE NO ACTION

has n, :commentswithinを使用して withinPostを含めないことを選択した場合でも、テーブルbelongs_to :postCommentpost_id列はcomments作成され、インデックスが作成されますが、外部キー制約は追加されません。

于 2013-09-27T11:42:33.573 に答える
0

これにより、リレーショナル オブジェクトに簡単にアクセスするためのメソッドが提供されます。など@post.comments @comment.post。has_many を適用すると、belongs_to が暗示される可能性があります。belongs_to を追加する開発者のオーバーヘッドを考えると、メソッドを適切なクラスに動的に追加するためにシステム オーバーヘッドを追加するよりもおそらく良いでしょう。

もう 1 つの問題は、別の has_many 関係を介して has_many 関係を使用する場合です。これにより、belong_to 関係が奇妙になり、SQL で問題が発生する可能性があります。

例えば:

class User < ActiveRecord::Base
  has_many :roles, :through => :roles_users
  has_many :roles_users
end

RolesUser は、ユーザーとロール モデルの両方の belongs_to を持つ結合テーブルです。この場合、所属先を暗示すると、ロールモデルに所属先がユーザーに追加されます。これも意味がありません。データベース列がないために機能しません。もちろん、through オプションがある場合はこれを調整できますが、必要のない場合はコードが非常に複雑になります。Daan が彼の答えで言ったように、それが機能するために両方は必要ありません。オプションです。

于 2011-09-06T16:03:44.770 に答える