我的设置message
有很多url
。
我正在使用Devise。
我正在尝试在集合上选择此表单以仅收集与url
关联的current_user
。目前它抓住了所有网址。
<%= f.select :url_id,
Url.order('name asc').all.collect { |u| [u.name, u.id] },
{ class: 'form-control' }
%>
我可以执行将.all
更改为.where
current_user.id
等内容吗?
答案 0 :(得分:1)
让你的模特像:
class User < ApplicationRecord
has_many :messages
end
class Message < ApplicationRecord
belongs_to :user
has_many :urls
end
class Url < ApplicationRecord
belongs_to :message
end
然后,您可以使用joins
中的Url
,然后使用User
模型,并使用pluck
获取url
和{{ 1}}属性,类似于:
id
您在def new
@urls = Url.joins(message: :user).where('users.id = ?', current_user).pluck(:url, :id)
end
方法中定义了一个名为@urls
的实例变量(我认为它是您当前的方案),它获取new
的网址。
请注意,创建变量是为了维护MVC逻辑,而不在视图中添加查询。
然后你可以在你的视图中添加current_user
表单助手,传递select
变量,一个空的第三个参数,然后是第四个类:
@urls
答案 1 :(得分:1)
以为我会分享我最终结束的工作。
我在message
添加了一个final_url列。
before_create组合了request.base_url和short_url。将这两个组合成一个列后,只有两个列才有用。
message.rb
before_create do
self.body = "#{self.body} #{self.url}"
end
选择工作为塞巴斯蒂安建议
<%= f.select :url, @urls, {}, class: 'form-control' %>
message_controller.rb
@urls = Url.where('user_id = ?', current_user).pluck(:name, :final_url)