使用Sinatra的DataMapper多对多关联

时间:2010-07-02 05:01:21

标签: ruby sinatra datamapper

我只是在构建一个简单的博客时盯着学习Sinatra和DataMapper。我似乎遇到了让我的多对多协会工作的问题。我正在尝试将类别与帖子相关联。创建帖子后,不会创建类别关联。

以下是我的模特:

class Post

  include DataMapper::Resource

  has n, :categories, :through => Resource

  property :id,             Serial
  property :title,          String
  property :slug,           String
  property :body,           Text
  property :description,    Text
  property :created_at,     DateTime
  property :updated_at,     DateTime
  property :posted_at,      DateTime

end

class Category

  include DataMapper::Resource

  has n, :posts, :through => Resource

  property :id,             Serial
  property :title,          String

end

DataMapper成功构建了category_posts表。我不认为我的创建表单中的代码是正确的。

 <form action="/post/create/" method="post">
        <% @category = Category.all %> 
        <% @category.each_with_index do |cat,i| %>
            <input id="category<%=i%>" type="checkbox" value="<%= cat.title %>" name="post.category.<%=cat.id%>" />
            <label for="category<%=i%>"><%= cat.title%></label>
        <% end %>
    <p>
            <input type="submit">
        </p>
    </form>

我尝试在category_posts表中手动创建条目,但不会显示任何记录。以下是我的视图与类别相关的部分。计数用于调试,它总是读为0。

<%= @post.categories.count %>
    <% @post.categories.each do |category| %>
        <p>Test: <%= category.title %></p>
    <% end %>

任何想法我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

documentation for Datamapper(“有,并且属于,很多(或多对多)”部分有一些提示,正如@Mika Tuupola所指出的,看起来你已经设置了你的模型正确,问题可能在于使用你的模型:

post  = Post.create
category = Category.create

# link them by adding to the relationship
post.categories << category
post.save

p post.categories # => [#<Category @id=1>]

答案 1 :(得分:0)

我对datamapper的经验有限,但您是否需要在两个ID上定义:key => true