我有4个表:users,observative_session,observation,celestial_bodies
每个用户都有许多observative_session,每个observative_session都有很多观察。我已经在模型中加入了关联
所以在observative_session中我有一个foreign_key(user_id)将它链接到用户,并且在观察中我有一个用户的外键(user_id)和observative_session的外键(observative_session_id)加上celestial_body的另一个外键(celestial_body_id) 。
我创建了一个表单,我要求用户插入天体名称
<%= f.text_field :celestial_body_id, label: 'Celestial body' %>
但是我不能将字符串保存为id,所以我需要找到与插入的主体相对应的id并保存它。
我试着定义一个虚拟属性
def celestial_body_name
CelestialBody.where(' ')
end
def celestial_body_name= (name)
celestyal_body_id = CelestialBody.where(name: celestial_body_name)
end
然后我创建了新的观察
def create
@observation = @observative_session.observations.build(observation_params)
....
end
但我得到了未定义的方法&#39;观察&#39;为零:NilClass 我不明白我是否正确传递了参数。
感谢您的帮助。
答案 0 :(得分:0)
您应该使用https://github.com/bigtunacan/rails-jquery-autocomplete作为自动完成解决方案。您需要考虑将其他隐藏字段作为celestial_body_id传递,以在控制器中创建有效关联。我认为这部分应该对你有帮助 - https://github.com/bigtunacan/rails-jquery-autocomplete#sending-extra-search-fields。
当然你仍然可以在没有自动完成功能的情况下传递名称,但它对于UI来说是不好的(你永远不知道这个类别是否存在,你甚至可以在其中输入一些错误)并且它需要在后端方面对逻辑进行额外的查询