我想为基于两列的记录定义一个唯一键:"id"和"language"

要让用户提交以下字符串:

I tried to use set_primary_key and also add_index but it didn't work ( add_index :words, ["id", "language_id"], :unique => true )

我有以下型号:

class Word < ActiveRecord::Base
  belongs_to :dictionnary
  belongs_to :language

  attr_accessible :lang, :rev, :value, :dictionnary_id, :language_id

  validates :value, :uniqueness => true

end  

还有这个

class Language < ActiveRecord::Base
    has_many :words

    attr_accessible :lang
end

推荐答案

add_index :words, ["id", "language_id"], :unique => true

应该行得通.也许您的数据库中已经有一些非唯一数据,无法创建索引?但是(正如@Doon所注意到的,它将是多余的,因为id总是唯一的).所以需要在两列上创建主键.

要在rails中定义2列主键,请使用:

create_table :words, {:id => false} do |t|
  t.integer :id
  t.integer :language_id
  t.string :value
  t.timestamps
end
execute "ALTER TABLE words ADD PRIMARY KEY (id,language_id);"

并在模型中使用以下gem:http://rubygems.org/gems/composite_primary_keys设置主键:

class Word < ActiveRecord::Base
    self.primary_keys = :id,:language_id
end

Ruby-on-rails相关问答推荐

仅当未在带有ENV[';Dyno';]的Heroku问题上运行时才初始化Sidekiq Cron

我使用rbenv安装Ruby,但我在使用";gem";->;错误:执行gem时遇到此错误.(Errno::EACCES)权限被拒绝

RSpec系统测试无法从工厂访问新创建的记录

使用Rails和RSpec,有没有办法查看操作真正将您带到哪个页面?

Ruby on Rails 更新触发了 Mailer 函数中的 ArgumentError

您如何测试方法调用块内调用的方法,以及使用 rspec 在块内传递给该方法调用的内容

如何使用 RSpec 和 Devise/CanCan 进行集成测试?

如何在 Ruby on Rails 中创建一个锚点并重定向到这个特定的锚点

rails 3:将链接显示为按钮?

使用devise gem点击确认链接后避免登录?

机械师 vs FactoryGirl - 优点和缺点

rails 方法获取模型的关联名称

如何从邮箱中获取域

将图标添加到 Rails 应用程序

为什么 Google Oauth 在我的 Rails 应用程序中返回无效的 redirect_urI?

如何设置 MiniTest?

RoR select_tag 默认值和选项

rails路由中资源和资源之间的区别?

我如何为 Rails3/Bundler 供应 gems

我什么时候需要在 Rails 中重新启动服务器?