Rails:从表中的三列更改为一列

时间:2012-12-11 01:11:00

标签: ruby-on-rails-3

我正在修改Documents表,使用三列(article1article2article3)到一个(articles),其中包含一个字符串存储在其中的以逗号分隔的ID(即23,4,33,2)。这一切都运作良好,但我正在尝试调整读取三列的函数来读取它,而我却陷入困境。

在模型中我有:

scope :all_articles, lambda {|p| where(:page => p) }

在控制器中我有这个:

@articles = (1..3).to_a.map { |i| Article.all_articles(i).reverse }

在视图中:

<% @articles.each_with_index do |a, i| %>
  <%= a[i].name %>
<% end %>

此时此刻有点超出我的范围。

干杯!

1 个答案:

答案 0 :(得分:1)

将ID存储在列中并不是一件好事。最好将这种关系分解为Has和Belongs to Many关系。您可以在模型中进行设置:

class Document < ActiveRecord::Base
  #...
  has_and_belongs_to_many :articles
  #...
end

class Article < ActiveRecord::Base
  #... 
  has_and_belongs_to_many :documents
end

然后,您将创建一个ActiveRecord将用于存储关系的连接表。

create_table :articles_documents, :id => false do |t|
  t.integer :article_id
  t.integer :document_id
end

add_index :articles_documents, [:article_id, :document_id], unique: true

这样您可以比现在更有效地查询。例如,要查找具有某些文章ID的所有文档。你会这样做:

@documents = Document.joins(:articles).where("articles.id = ?", some_article_id)

或者,如果您想查询文档并使用它返回文章:

@documents = Document.includes(:articles).where(some_conditions)