ソースはすべて雰囲気(動作確認してないっす)。
今日ハマってた所。
例えば、 parents TBL
と childes TBL
があったとして、
CREATE TABLE `parents` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=565 DEFAULT CHARSET=utf8; CREATE TABLE `childes` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), CONSTRAINT `fk_rails_36a4cd8620` FOREIGN KEY (`client_office_id`) REFERENCES `client_offices` (`id`), ) ENGINE=InnoDB AUTO_INCREMENT=185 DEFAULT CHARSET=utf8;
childes TBL
の要素で作成したドロップダウンで選択したidを保持する、 parents TBL
のみ取得したいというケース。
modelにこういった形で定義しておけば
class Parents < ActiveRecord has_many :childes scope :has_childe_id, -> (childe_id) { eager_load(:childes).where('childes.id = ?', childe_id) } # for ransack scope def self.ransackable_scopes(auth_object=nil) %i(has_childe_id) end end
(画面側)
<% f.select :has_childe_id, Childes.all.map {|c| [c.name, c.id]}, { include_blank: true }, { class: 'form-control' } %>
SQLがこんなふうに、うまい具合に発行されることはわかった。
SELECT `parents`.`id` AS t0_r0 ,`parents`.`name` AS t0_r1 ,`childes`.`id` AS t2_r0 ,`clients`.`name` AS t2_r1 FROM `parents` LEFT OUTER JOIN `childes` ON `parents`.`id` = `childes`.`parent_id` WHERE ( childess.id = '2' )
しかし、childsのidが'1'だった場合、何故かこんなエラーが・・・
wrong number of arguments (0 for 1)
原因は、ransackのメソッドが 1
という値を自動でboolean値と解釈してしまうんだとか?
なので、↑のページを参考に、コントローラーに
params[:q][:has_childe_id] = [params[:q][:has_childe_id]] if params[:q].present?
みたいなのを書いて、
{ "utf8" => "✓", "q" => { "has_consultant_id" => "1" }, "commit" => "検索", "controller" => "parents", "action" => "index" }
ってくるパラメータを
{ "utf8" => "✓", "q" => { "has_consultant_id" => [ [0] "1" ] }, "commit" => "検索", "controller" => "parents", "action" => "index" }
といった形に整形・・・。
いやー、これ絶対間違ってるよなー・・・。
あれ、でもこれで治ってるのかな?