缩短映射和连接

时间:2017-01-05 21:25:06

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我得到一个包含var express = require('express'); var app = express(); var r = require('rethinkdb'); var bodyParser = require('body-parser'); var session = require('express-session'); var bcrypt = require('bcryptjs'); function dbConnect(){ var connection = null; r.connect({host: 'localhost', port: 28015}, function(err, conn){ if (err){ throw err; }else{ connection = conn; console.log("Connected to Rethink"); } }); } dbConnect(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(session({secret: 'gitTy Up!',resave: false,saveUninitialized:true})); app.use(require('connect-flash')()); app.set('view engine','ejs'); //Home Page app.get('/', function (req, res) { res.render('home'); }) app.get('/join', function (req, res) { res.render('join'); }) app.post('/join',function(req, res){ var salt = bcrypt.genSaltSync(10); r.table('users').insert([{email: req.body.email, password: bcrypt.hashSync(req.body.password, salt)}]) .run(connection, function(err,result) { if (err) throw err; console.log(JSON.stringify(result, null, 2)); }) }); app.listen(3000); 个对象的数组。 person可以包含多个person

houses

有些房屋可能属于多个 person.houses => ActiveRecord_Associations_CollectionProxy 。在我的代码中,我想为数组中的人员获取所有唯一的persons

这是代码的长版本:

houses

您知道这个 def persons_houses(persons) unique_houses = [] persons.each do |person| person.houses.each do |house| unique_houses << house if !unique_houses.include? house end end unique_houses end 方法的代码较短吗?

我正在考虑绘制人物房屋,同时连接它们然后返回唯一值

类似的东西:(但这不是有效的Ruby)

persons_houses(persons)

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

每个人都有很多房子,一个房子可能属于很多人?怎么样:

persons.map(&:houses).flatten.uniq

答案 1 :(得分:0)

您可以使用单个数据库查询执行此操作,而无需解析数组。假设你有一个关系表(不确定一个人怎么可以有很多房子,一个房子可以有很多人),并假设你的关系表被称为ownerships,你会这样做:

House.joins(:ownerships).where(ownerships: {person_id: persons.ids}).uniq

这比其他建议的答案要快得多,内存效率也高得多,而且它还为您提供了ActiveRecord_Relation,因此您可以进一步确定结果的范围。