我已经阅读了一些关于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
现在看来我的观点有问题,但是简化视图和修改我的图书馆和部门类已经解决了我原来的问题。现在,我试图找出最佳案例场景,以制作动态表单,根据所选对象更改类型,并将库和部门加载到选择字段中。
已移除 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>
在更新2之后,我认为我的真正问题在于找出这些内容的观点。我知道部门和图书馆课程可以访问normal_hours信息。我遇到的问题是通过表单输入数据并使用相同的表单来更新数据。
@normal_hours.resource_type.all
我需要一个条件来关闭字段或根据输入的信息类型隐藏字段。我考虑过使用JS来隐藏/显示正确的下拉列表的检查按钮或问题,但是我需要根据类型更改特定类需要什么样的逻辑,或者有更好的方法。
我在想我在collection_select中的潜能值我可以使用引用类型来调用类toString
,但我怀疑它会实例化一个新类。
答案 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关联覆盖部门的定义。