ruby-on-rails-3 - 混合 has_one 和 has_and_belongs_to_many 关联

标签 ruby-on-rails-3

我正在尝试建立一个 url(链接)数据库。我有一个类别模型,它拥有并属于许多链接。

这是我运行的迁移:

class CreateLinksCategories < ActiveRecord::Migration
  def self.up
    create_table :links_categories, :id => false do |t|
    t.references :link
    t.references :category
  end
end

def self.down
  drop_table :links_categories
  end
end

这是链接模型:

class Link < ActiveRecord::Base  
  validates :path, :presence => true, :format => { :with  => /^(#{URI::regexp(%w(http     
                                                   https))})$|^$/ }
  validates :name, :presence => true

  has_one :category
end

这是类别模型:

class Category < ActiveRecord::Base
  has_and_belongs_to_many :links
end

这是当我尝试将第一个链接与第一个类别相关联时控制台返回的错误:

>>link = Link.first
=> #<Link id: 1, path: "http://www.yahoo.com", created_at: "2011-01-10...
>>category = Category.first
=> #<category id : 1, name: "News Site", created_at: "2011-01-11...
>>link.category << category
=> ActiveRecord::StatementInvalid: SQLite3::Exception: no such column :           
   categories.link_id:

我的联想是错误的还是我在数据库中遗漏了什么?我希望它能找到 links_categories 表。感谢您的帮助。

最佳答案

您为什么要在这里使用 HABTM?只需在链接上放一个 belongs_to :category,在类别上放一个 has_many :links。然后在数据库中,您根本不需要连接表,只需要链接表上的 :category_id。

但是,如果您确实需要 HABTM,快速浏览一下,我注意到的第一件事是您的连接表命名不正确——它应该是按字母顺序排列的,categories_links

第二件事是你不能混合 has_one 和 has_and_belongs_to_many。 HABTM 的意思就是——A 有很多 B,A 属于很多 B;这种关系意味着相反的情况也一定成立——B 有很多 A,B 属于很多 A。如果链接 HABTM 类别,那么类别必须有 HABTM 链接。

参见 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many

关于ruby-on-rails-3 - 混合 has_one 和 has_and_belongs_to_many 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4660795/

相关文章:

ruby-on-rails-3 - Ruby on Rails呈现具有动态内容和部分内容的表

ruby-on-rails - Michael Hartl 的 Ruby on Rails 教程。第 9 章中的失败测试

ruby-on-rails - 为所有 Rails 环境配置设置

ruby-on-rails - ActionMailer 测试中的未定义方法 'assert_select_email' [Rails 3.2.13]

ruby-on-rails-3 - Refinery CMS - 连接发动机中两个模型的正确技术?

javascript - 如何使用 javascript 中的 Rails.logger

rvm - 无法在rvm上安装rails3

ruby-on-rails-3 - 使用 ActionMailer 在 Rails 中发送给多个收件人

ruby-on-rails - Ajax 删除链接 注销current_user

mysql - ruby 在 mysql 中为列类型 'time' 添加日期 2000-01-01