2016-07-27 7 views
0

Diese Zeile löst den Fehler "falsche Anzahl der Argumente (1 gegeben, erwartet 0)" aus. Ich würde wirklich gerne wissen, wie diese Abfrage funktioniert. Vielen Dank!Warum bekomme ich eine Fehlermeldung "falsche Anzahl von Argumenten (1, erwartete 0)" für eine Suchabfrage in Rails?

@posts = Post.all(:joins => :course, :conditions => "course.name in (#{@user.courses.map(&:name).join(',')})",:order => "posts.created_at DESC") 

Dies ist Code in meinem Controller:

@user = current_user 
@posts = Post.all(:joins => :course, :conditions => "course.name in (#{@user.courses.map(&:name).join(',')})",:order => "posts.created_at DESC") 

Hier sind die Modelle:

class Post < ActiveRecord::Base 
belongs_to :user 
belongs_to :course 
has_many :comments 
end 

class Course < ActiveRecord::Base 
belongs_to :user 
has_many :posts 
belongs_to :major 
end 

class User < ActiveRecord::Base 
# Include default devise modules. Others available are: 
# :confirmable, :lockable, :timeoutable and :omniauthable 
devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

has_many :courses 
belongs_to :major 
has_many :posts 
has_many :comments 

accepts_nested_attributes_for :courses, reject_if: :all_blank,  allow_destroy: true 
end 

Und hier ist das Schema

create_table "comments", force: :cascade do |t| 
t.text  "comment" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.integer "user_id" 
t.integer "post_id" 
end 

add_index "comments", ["post_id"], name: "index_comments_on_post_id" 
add_index "comments", ["user_id"], name: "index_comments_on_user_id" 

create_table "courses", force: :cascade do |t| 
t.string "name" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.integer "major_id" 
t.integer "user_id" 
end 

add_index "courses", ["major_id"], name: "index_courses_on_major_id" 
add_index "courses", ["user_id"], name: "index_courses_on_user_id" 

create_table "majors", force: :cascade do |t| 
t.string "name" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
end 

create_table "posts", force: :cascade do |t| 
t.string "title" 
t.text  "content" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.integer "user_id" 
t.integer "course_id" 
end 

add_index "posts", ["course_id"], name: "index_posts_on_course_id" 
add_index "posts", ["user_id"], name: "index_posts_on_user_id" 

create_table "users", force: :cascade do |t| 
t.string "email",     default: "", null: false 
t.string "encrypted_password",  default: "", null: false 
t.string "reset_password_token" 
t.datetime "reset_password_sent_at" 
t.datetime "remember_created_at" 
t.integer "sign_in_count",   default: 0, null: false 
t.datetime "current_sign_in_at" 
t.datetime "last_sign_in_at" 
t.string "current_sign_in_ip" 
t.string "last_sign_in_ip" 
t.datetime "created_at",       null: false 
t.datetime "updated_at",       null: false 
t.boolean "admin" 
t.string "username" 
t.integer "major_id" 
end 

add_index "users", ["email"], name: "index_users_on_email", unique: true 
add_index "users", ["major_id"], name: "index_users_on_major_id" 
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 
add_index "users", ["username"], name: "index_users_on_username", unique: true 

end 

Antwort

0

Der Fehler, den Sie bekommen in der Abfrage ist aufgrund der Tatsache, dass die all Methode erwartet keine Parameter, es ruft nur alle Datensätze für ein bestimmtes Modell/Relation ab.

Was Sie in diesem Fall verwenden möchten, ist die where-Methode von ActiveRecord :: QueryMethods.

Es gibt einen weiteren Fehler, Sie verwenden den Namen der Tabelle in Singular auf Ihre Bedingung, wo es Plural sein sollte (Kurse statt natürlich).

Sie können auch hier die Methode includes kombiniert mit der Methode references verwenden, um den Datenbankbeitritt zu generieren.

Also, würden Sie so etwas wie die folgenden haben:

@posts = Post.includes(:course).where("courses.name IN (#{@user.courses.map(&:name).collect { |s| '#{s}' }.join(',') })").references(:courses).order("posts.created_at DESC") 
+0

Das den Fehler nahm weg von der Abfrage, das ist toll! Aber ich habe jetzt einen Fehler auf "@ posts.each do", die besagt, dass "Association namens 'Kurse' nicht auf Post gefunden wurde;" – Ryan

+0

Dies ist ein Problem mit dem Assoziationsnamen, der in includes verwendet wird (in Referenzen ist es korrekt, da diese Methode den Tabellennamen erwartet!), Sollte es Kurs statt Kurs sein, da es ein Eins-zu-Viele ist Posts) Beziehung. Ich habe den Tippfehler behoben. Außerdem konnte ich die Abfrage noch nicht vollständig verifizieren, da ich gerade mobil bin. – joaovictortr

+0

Es gibt diesen Fehler: SQLite3 :: SQLException: nahe "Netzwerke": Syntaxfehler: SELECT "Beiträge". "ID" AS t0_r0, "Beiträge". "Titel" AS t0_r1, "Beiträge". "Inhalt" AS t0_r2, "posts". "created_at" AS t0_r3, "Beiträge". "updated_at" AS t0_r4, "Beiträge". "user_id" AS t0_r5, "Beiträge". "course_id" AS t0_r6, "Kurse". "id" AS t1_r0, "Kurse". "Name" AS t1_r1, "Kurse". "created_at" AS t1_r2, "Kurse". "updated_at" AS t1_r3, "Kurse". "major_id" AS t1_r4, "Kurse". "user_id" AS t1_r5 FROM "posts" LEFT OUTER JOIN "Kurse" ON "Kurse". "id" = "Beiträge". "course_id" WHERE (Kurse.Name IN (Electrical Networks, Physik 3)) – Ryan

Verwandte Themen