Rails在加入后从所有表中获取列名

时间:2016-02-12 02:26:33

标签: mysql ruby-on-rails params

我正在尝试从几个已执行连接的表中获取列名来组合它们。

我尝试过以下操作:

User.joins(:user_account, :user_file, :user_education).column_names 

但这只是从User返回列名,就像我刚刚完成以下操作一样:

User.column_names 

有谁知道如何从连接中获取所有列名?似乎通常不需要这样做,因为在网上似乎没有太多关于它的信息。我需要它来验证用户参数。

谢谢!

编辑:

用户表中的列名:

["id", "status", "accepted_terms", "created_at", "updated_at", "email", "encrypted_password", "reset_password_token", "reset_password_sent_at", "remember_created_at", "sign_in_count", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip", "confirmation_token", "confirmed_at", "confirmation_sent_at", "unconfirmed_email", "provider", "uid"]

User_account表中的列名:

 ["first_name", "last_name", "phone_number", "address"]

我希望能够获得整个列名列表,即

["id", "status", "accepted_terms", "created_at", "updated_at", "email", "encrypted_password", "reset_password_token", "reset_password_sent_at", "remember_created_at", "sign_in_count", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip", "confirmation_token", "confirmed_at", "confirmation_sent_at", "unconfirmed_email", "provider", "uid", "first_name", "last_name", "phone_number", "address"]

我需要什么方法来准确获取该列表?我试过了

User.joins(:user_account).column_names

但这只是给我第一组列名,即只是用户表中的列名(不是用户帐户表中的名称)。

3 个答案:

答案 0 :(得分:1)

你可以这样做:

User.column_names + UserAccount.column_names

等等。 Rails从ActiveRecord类中检索列名,而不是从SQL关系中检索。

UPD。或者更惯用的

[User, UserAccount, UserFile, UserEducation].flat_map(&:column_names).uniq

答案 1 :(得分:0)

这是红宝石吗? 我对那种语言及其语法并不熟悉,但明确依赖于MySQL知识,我认为你缺乏这些表如何相互连接! 您可以看到this post以获取我认为有助于解决您问题的更多信息!

编辑: 邮报说: Rails允许您在字符串中编写自定义连接条件,如下所示:

@Override
protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setStroke(....); // do it here after casting
}

或更清洁只需指定几个连接子句:

Reservation.joins('INNER JOIN "tables" ON "tables"."id" = "reservations"."table_id" INNER JOIN "users" ON "users"."id" = "reservations"."user_id"')

要提取数据,您只需应用一些自定义选择子句,如下所示:

Reservation.join(:user).join(:table)

答案 2 :(得分:0)

你可以这样做。

User.select("users.*, user_accounts.*, user_files.*, user_educations.*").joins(:joins(:user_account, :user_file, :user_education))

我希望这会有所帮助。

快乐黑客