我想知道我是否可以获得关于Rails应用程序的关联和可能的数据类型的建议,我正在开始构建postgres后端。用户可以创建一个条目,其中has_many:更正意味着多个用户可以更正条目错误的条目。
对我来说,具有挑战性的部分是因为Entry的内容被分解为单独的字符串,每个字符串都将单独更正。例如,假设我创建了一个带有标题的条目(这是一个字符串)“我的猫”和内容(文本列)“我的猫的名字是菲利克斯。他有黑头发”,然后我希望能够为每个人单独提交更正。在我的corrections_controller.rb的新动作中,我做了这个
def new
@entry = Entry.find(params[:entry_id])
@title = @entry.title
@content = @entry.content.split('.')
@correction = Correction.new
end
所以在views / corrections / new.html.erb中,我这样做是为了创建标题的表单元素以及Entry.rb内容中的每个字符串
<%= @title %>
<%= form_for [@entry, @correction], url: {action: "create"}, html: {class: "nifty_form"} do |f| %>
<%= label_tag(:content, "Content") %>
<%= f.text_area :content, size: "60x12" %>
<%= f.submit "Create" %>
<% end %>
<hr>
<% @content.each do |c| %>
<%= c %>
<%= form_for [@entry, @correction], url: {action: "create"}, html: {class: "nifty_form"} do |f| %>
<%= label_tag(:content, "Content") %>
<%= f.text_area :content, size: "60x12" %>
<%= f.submit "Create" %>
<% end %>
<% end %>
现在,我在Entry.title“我的猫”下面有一个更正表格,并且对于“我的猫的名字是菲利克斯”和“他有黑头发”这一条目的每一个字符串。
这有以下问题(我认为这是一个问题)
虽然我将其设置为条目has_many:更正,但这意味着条目可能会被许多不同的用户更正,每个用户都会提交一次更正。然而,它的结果是,例如,如果一个条目在内容列中有十个句子,而另一个用户纠正了10个句子中的每一个,那么该用户将有10个单独的更正。
我是否可以提交一种推荐的方式,例如,我的假设条目(“我的猫”,“我的猫的名字是菲利克斯”,“他的头发是黑色的”)的三个更正为一个更正表格中的一行,保持条目的每个句子与用户的修正相关联,这样当我从数据库中检索到我的修正时,我可以显示标题,修正,第一句带有修正,第二句带有修正更正?我认为hstore可能是解决这个问题的方法,但我不知道如何解决这个问题。
根据您对问题#1的回答,您是否会将corrections_controller.rb中的Entry拆分为单独的实例变量或执行其他操作?
def new
@entry = Entry.find(params[:entry_id])
@title = @entry.title
@content = @entry.content.split('.')
@correction = Correction.new
end
3)如果您使用postgres hstore,您是否会将key
和更正后的句子更正为value
>> Correction.create( :data => { "My Cat's name is Felix" => "My cat's name is Felix", "He has black hair" => "He has black fur"})
Correction.last.data 校正负荷(1.0ms)SELECT“校正”。* FROM“校正”ORDER BY“校正”。“id”DESC LIMIT 1 =&GT; {“他有黑头发”=&gt;“他有黑色皮毛”,“我的猫的名字是菲利克斯”=&gt;“我的猫的名字是菲利克斯”}
根据我告诉你的内容,使用Rails和postgres有更好的方法吗?
请注意,在我用作灵感的应用中,虽然有多个表单字段对应于要更正的字符串,但一旦用户点击“提交”,它们就会立即提交。这也是我的目标。
模型
Entry.rb (has a :title and a :content column)
has_many :corrections
Correction (has one column, :content, as well as :user_id and :entry_id)
belongs_to :entry
答案 0 :(得分:1)
这听起来不像hstore
在这里工作得特别好。
由于您将内容分成句子,为什么不在数据库中反映出来?将内容存储在sentence
表中:
(sentence_id int4, entry_id int4, order int2, content text)
这也意味着你不需要对标题进行特殊处理,它只是一个order == 0
的句子。
然后,每个更正都可以引用一个特定的句子,并且您不受限制每个用户有多少更正:
(correction_id int4, sentence_id int4, user_id int4, corrected_content text)
似乎更简单。