Rails数据库关联多态关联

时间:2016-09-20 18:57:00

标签: ruby-on-rails ruby ruby-on-rails-5

我已经阅读了一些关于PolyMorphic Associations的帮助主题和ruby文档,我仍然不确定这是否可行。在与这个概念挣扎并试图解决这个问题之后,我想到了这里。

到目前为止我尝试过的是打破图书馆和部门模型中所有其他CRUD操作。

正常时间等级

class Library < ApplicationRecord
  has_many :departments, dependent: :destroy
  has_many :normal_hours, as: :resource, dependent: :destroy

  def departments
      departments = Department.where(:library_id => self.id)
  end
end

图书馆类

class Department < ApplicationRecord
  belongs_to :library, inverse_of: :departments
  has_many :normal_hours, as: :resource, dependent: :destroy
end

部门类

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int(11)      | NO   | PRI | NULL    | auto_increment |
| resource_type | varchar(255) | YES  | MUL | NULL    |                |
| resource_id   | int(11)      | YES  |     | NULL    |                |
| day_of_week   | int(11)      | YES  |     | NULL    |                |
| open          | time         | YES  |     | NULL    |                |
| close         | time         | YES  |     | NULL    |                |
| created_at    | datetime     | NO   |     | NULL    |                |
| updated_at    | datetime     | NO   |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

问题变成了在添加后我无法再添加或删除库或部门中的任何内容。

有什么想法?教程?样品?等等?

更新

dependent: :destroy

更新2

现在看来我的观点有问题,但是简化视图和修改我的图书馆和部门类已经解决了我原来的问题。现在,我试图找出最佳案例场景,以制作动态表单,根据所选对象更改类型,并将库和部门加载到选择字段中。

已移除 class Library < ApplicationRecord has_many :departments, dependent: :destroy has_many :normal_hours, as: :resource def departments departments = Department.where(:library_id => self.id) end end

图书馆类

class Department < ApplicationRecord
  belongs_to :library, inverse_of: :departments
  has_many :normal_hours, as: :resource
end

部门类

  <div class="field" >
    <%= f.collection_select(:resource_id, Library.all, :id, :name)  %>
  </div>

  <div class="field">
    <%= f.collection_select(:resource_id, Department.all, :id, :reformat_name) %>
  </div>

更新3

问题更新:

在更新2之后,我认为我的真正问题在于找出这些内容的观点。我知道部门和图书馆课程可以访问normal_hours信息。我遇到的问题是通过表单输入数据并使用相同的表单来更新数据。

@normal_hours.resource_type.all

我需要一个条件来关闭字段或根据输入的信息类型隐藏字段。我考虑过使用JS来隐藏/显示正确的下拉列表的检查按钮或问题,但是我需要根据类型更改特定类需要什么样的逻辑,或者有更好的方法。

我在想我在collection_select中的潜能值我可以使用引用类型来调用类toString,但我怀疑它会实例化一个新类。

1 个答案:

答案 0 :(得分:0)

我认为你的多态关联有错误。看看rails guide on polymorphic associations。您的normal_hours表应该有两个字段:resource_id和resource_type。使用这两个键,NormalHour可以属于库或部门。在一种情况下,这些字段中的值将是“5”和“库”,而另一种情况是“12”和“部门”。你图片中的模式不是多态的 - 简单地说,NormalHour可以属于其中任何一个。

这也可能导致问题:

def departments
  departments = Department.where(:library_id => self.id)
 end

这就是用has_many关联覆盖部门的定义。