如何设计警察罚款数据库?

如何解决如何设计警察罚款数据库?

使用 Rails 6 我正在设计一个应用程序来管理警察罚款。一个用户可以违反很多文章,一篇文章可以有很多字母,一个字母可以有很多逗号。

这是我的实现:

#models/fine.rb
class Fine < ApplicationRecord
  has_many :violations
  has_many :articles,through: :violations
  has_many :letters,through: :violations
  has_many :commas,through: :violations
end
#models/article.rb
class Article < ApplicationRecord
  has_many :letters
  has_many :violations
  has_many :fines,through: :violations
end
#models/letter.rb
class Letter < ApplicationRecord
  belongs_to :article
  has_many :commas

  has_many :violations
  has_many :fines,through: :violations

end
#models/comma.rb
class Comma < ApplicationRecord
  belongs_to :letter

  has_many :violations
  has_many :fines,through: :violations
end
#models/violation.rb
class Violation < ApplicationRecord
  belongs_to :fine

  belongs_to :article
  belongs_to :letter,optional: true
  belongs_to :comma,optional: true
end

当我以 PDF 格式打印罚款时,我需要显示违规行为:文章、字母和逗号。我很难创建一个表格来编译罚款,因为它太深了。我正在使用 Active Admin,当我创建一个新的罚款时,我想关联许多违规行为。

违规示例:

Violation.new
 => #<Violation id: nil,article_id: nil,fine_id: nil,letter_id: nil,comma_id: nil,note: nil,created_at: nil,updated_at: nil> 

我如何创建一个表单(使用 Active Admin,它使用 Formtastic)将许多违规行为与罚款相关联?示例表单:

enter image description here

示例(含样本数据):

Violation.new fine: fine,article: a,letter: a.letters.last,comma: a.letters.second.commas.last
 => #<Violation id: nil,article_id: 124,fine_id: 66,letter_id: 10,comma_id: 4,updated_at: nil> 

解决方法

以我的拙见,您的问题相当模糊,仅根据提供的信息很难回答。由于我无法给出绝对能解决您问题的答案,请允许我尝试为您指明正确的方向。

渲染表单

首先让我们理解这里的问题:您正在尝试在嵌套资源表单中创建关联记录

您需要为 Fine 自定义表单以包含每个违规的表单。看看how ActiveAdmin handles nested resources。它应该是这样的:

ActiveAdmin.register Fine do
  form do |f|
    inputs 'Violations' do
      f.has_many :violations do |vf|
        vf.input :article,as: :select,collection: Article.all
        vf.input :letter,collection: Letter.all
        vf.input :comma,collection: Comma.all
      end
    end
  end
end

简而言之,这是您问题的答案“我如何创建一个表单(使用 Active Admin,使用 Formtastic)将许多违规行为与罚款相关联?”

注意事项

您可能已经注意到,这种方法存在一些问题。

首先,它与您的示例完全不同。您可以使用 as: :check_boxes 轻松更改 Formtastic 的内容以添加复选框,但您会发现复选框并没有按照您想要的方式进行组织,并带有漂亮的缩进。据我所知,您无法使用 Formtastic 执行此操作。相反,我相信您必须使用 a partial

使用部分,您可以轻松浏览文章,并为每个文章呈现一个复选框并浏览每个人的信件,等等。但是,请记住,此表单将要求您 customize the controller,以便它了解这些复选框中的每一个并创建相应的违规行为。没有那么直接。

其次,这里没有强制执行数据完整性。可以选择一篇文章、另一篇文章的字母和第三篇文章的逗号(顺便说一句,我希望您有一个验证来保护您免受此影响)。要使表单动态更改,因此在选择后仅显示给定文章的字母,逗号也是如此,需要一些客户端逻辑。如果你问我,那不值得麻烦。

结论

你的问题远非简单明了,无论是回答还是解决。您始终拥有的一个选项是一组自定义路由,用于在 ActiveAdmin 之外管理此类资源。请记住,像这样的工具仅与它们从您那里获得的工作一样有价值。如果你不得不与之抗争,最好只是让对方走开。

希望这会有所帮助,无论如何。

,

已解决:

  f.has_many :violations do |vf|
    vf.input :article,include_blank: false,collection: options_for_select(Article.all.map {|article| [article.number,article.id,{ :'data-article-id' => article.id,:'data-letters' => article.letters.map(&:id).to_json }]})
    vf.input :letter,collection: options_for_select(Letter.all.map {|letter| [letter.letter,letter.id,{ :'hidden' => true,:'data-letter-id' => letter.id,:'data-article-id' => letter.article.id,:'data-commas' => letter.commas.map(&:id).to_json }]})
    vf.input :comma,collection: options_for_select(Comma.all.map {|comma| [comma.number,comma.id,:'data-comma-id' => comma.id,:'data-letter-id' => comma.letter.id }]})
  end

加上一点javascript:

$(document).on('has_many_add:after','.has_many_container',function (e,fieldset,container) {
    selects = fieldset.find('select');
    article_select = selects[0];
    letter_select = selects[1];
    comma_select = selects[2];

    $(article_select).on("change",function () {
        $(letter_select).prop('selectedIndex',0);
        $(comma_select).prop('selectedIndex',0);
        $("#" + letter_select.id + " option").prop("hidden",true);
        $("#" + comma_select.id + " option").prop("hidden",true);

        letters = $(this).find(':selected').data('letters');

        $.each(letters,function (index,id) {
            $("#" + letter_select.id + " option[data-letter-id='" + id + "']").removeAttr("hidden");
        });
    });

    $(letter_select).on("change",function () {
        $(comma_select).prop('selectedIndex',0);
        $("#" + comma_select.id + " option").prop("hidden",true);

        commas = $(this).find(':selected').data('commas');

        $.each(commas,id) {
            $("#" + comma_select.id + " option[data-comma-id='" + id + "']").removeAttr("hidden");

        });
    });
});

我在选择框中显示所有文章、字母和逗号。最初逗号和字母是隐藏的,然后当用户单击文章时,字母的选择框仅显示相关的字母。 逗号代码的工作原理与字母相同。 在我可以在 Violation 模型中添加一些验证之后。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?