Having trouble using where.not in rails - ruby-on-rails

I am trying to use where.not to replace the following:
if #friend_matches.count > 0
#court_matches = Match.available_on_courts.where('matches.id NOT IN (?)', #friend_matches.pluck(:id)).to_a
else
#court_matches = Match.available_on_courts
end
With
#court_matches = Match.available_on_courts.where.not(matches.id: #friend_matches.pluck(:id)).to_a
However I am getting the following errors.
SyntaxError: /Users/sripaladugu/Coding/matchpoint_rails/app/mailers/match_mailer.rb:8: syntax error, unexpected ':'
...on_courts.where.not(matches.id: #friend_matches.pluck(:id))....
... ^
/Users/sripaladugu/Coding/matchpoint_rails/app/mailers/match_mailer.rb:8: syntax error, unexpected ')', expecting keyword_end
...id: #friend_matches.pluck(:id)).to_a

You can provide a hash within where to specify table names as keys and column names within the second level:
#court_matches = Match.available_on_courts
.where.not(matches: { id: #friend_matches.pluck(:id) })
.to_a

Related

setting conditional attributes for API connection

A method needs to instantiate a session with various attributes, some of which are optional
session = Checkout::Session.create({
locale: I18n.locale,
reference_id: id,
customer_email: #user_mail,
[...]
})
The last shown attribute, customer_email, is optional but it should not be generated if the value does not exist.
customer_email: #user_mail unless !#user_email,
logically hits a syntax error because an additional param (the comma) is being produced
syntax error, unexpected ',', expecting end
and thus the API expects another attribute.
(customer_email: #user_mail, unless !#user_email)
also fails as there is confusion over the parenthesis
syntax error, unexpected ')', expecting then or ';' or '\n'
How should this syntax be cast?
You need to extract the options hash into a variable and manipulate it before sending it to the Checkout::Session.create.
Something like this:
options = {
locale: I18n.locale,
reference_id: id
}
options[:customer_email] = #user_mail if #user_email
session = Checkout::Session.create(options)

unexpected tLabel ')' '=' and else

I'm getting this syntax error and I don't know what I'm supposed to do and I'm new to Ruby. In the future could someone tell me how I can resolve syntax errors
SyntaxError (/Users/admin/Moralyzer/app/controllers/petition_posts_controller.rb:23: syntax error, unexpected tLABEL, expecting ')'
url: item['url'],
^~~~
/Users/admin/Moralyzer/app/controllers/petition_posts_controller.rb:24: syntax error, unexpected tLABEL, expecting '='
media_type: item['type']
^~~~~~~~~~~
/Users/admin/Moralyzer/app/controllers/petition_posts_controller.rb:25: syntax error, unexpected ')', expecting end
)
^
/Users/admin/Moralyzer/app/controllers/petition_posts_controller.rb:28: syntax error, unexpected else, expecting end
else
^~~~
/Users/admin/Moralyzer/app/controllers/petition_posts_controller.rb:58: syntax error, unexpected end-of-input, expecting end):
app/controllers/petition_posts_controller.rb:23: syntax error, unexpected tLABEL, expecting ')'
app/controllers/petition_posts_controller.rb:24: syntax error, unexpected tLABEL, expecting '='
app/controllers/petition_posts_controller.rb:25: syntax error, unexpected ')', expecting end
app/controllers/petition_posts_controller.rb:28: syntax error, unexpected else, expecting end
app/controllers/petition_posts_controller.rb:58: syntax error, unexpected end-of-input, expecting end
The code
# POST /petition_posts
def create
#petition_posts = PetitionPost.new(petition_posts_params)
if #petition_posts.save
for item in media
#petition_posts.media.create (
url: item['url'],
media_type: item['type']
)
end
render json: #petition_posts, status: :created, location: #petition_posts
else
render json: #petition_posts.errors, status: :unprocessable_entity
end
end
Ruby doesn't want white-space between method name and the opening parentheses
#petition_posts.media.create (
should be
#petition_posts.media.create(
As a bonus point for loops are not the Ruby way, use each instead
media.each do |item|
#petition_posts.media.create(url: item['url'], media_type: item['type'])
end
Try changing this:
#petition_posts.media.create (
url: item['url'],
media_type: item['type']
)
To this:
#petition_posts.media.create(url:item['url'], media_type:item['type'])
All in one line.
Edit: I don't mean to edit so much in one minute (I'm kind of new to stackoverflow) but I figured out the issue. It isn't whitespace but where you put the terminating ')' for that function.
So the following are all valid:
#petition_posts.media.create(url:item['url'],
media_type:item['type'])
#petition_posts.media.create(
url:item['url'],
media_type:item['type'])
#petition_posts.media.create(
url:item['url'], media_type:item['type'])
As long as the ')' is attached to the end of your arguments list, you should be good.

writing a rspec test for checking a function that returns a hash table

Trying to write an RSpec test that checks a function location_counts(piece) that returns a hash table with some keys and values assigned.
describe "location_counts(piece)" do
it "should return a hash table with a key of locations and value of times visited" do
game = FactoryGirl.create(:game)
black_queen = FactoryGirl.create(:queen, game_id: game.id, row: 8, column: 4, is_black: true)
black_queen.move_to(4,4)
black_queen.move_to(1,1)
black_queen.move_to(4,4)
expect(game.location_counts(black_queen)).to be {"4, 4"=>2, "1, 1"=>1}
end
end
With this test, I'm getting a syntax error.
That looks like:
/usr/local/rvm/gems/ruby-2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1435:in `load': /home/ubuntu/workspace/chess-app/spec/models/game_spec.rb:101: syntax error, unexpected =>, expecting '}' (SyntaxError)
...s(black_queen)).to be {"4, 4"=>2, "1, 1"=>1}
... ^
/home/ubuntu/workspace/chess-app/spec/models/game_spec.rb:101: syntax error, unexpected =>, expecting '}'
...en)).to be {"4, 4"=>2, "1, 1"=>1}
... ^
The problem seems to be that ruby is interpreting your expected hash:
expect(game.location_counts(black_queen)).to be {"4, 4"=>2, "1, 1"=>1}
as a block passed to the be method, instead of as a parameter. Try the following:
expect(game.location_counts(black_queen)).to eq({"4, 4"=>2, "1, 1"=>1})
or even removing the curly braces, as the hash is the last parameter passed to the be method:
expect(game.location_counts(black_queen)).to eq("4, 4"=>2, "1, 1"=>1)
EDIT: Regard the usage of eq instead of be.

what's wrong with dynamic matchers on rails 4.0

I have an attribute which name is alias and method which create_alias.I use create_alias method as before_validation callback.In the method decleration I have following lines
while ProjectType.find_by_alias(tmp) != nil
tmp = self.alias + "-" + i.to_s
i += 1
end
As you can see, the code tries to create unique alias but on rails 4.0 we encounter this error message.
SyntaxError: /home/vagrant/.rvm/gems/ruby-1.9.3-p194#comRails4/bundler/gems/rails-39555a5b1989/activerecord/lib/active_record/dynamic_matchers.rb:65: syntax error, unexpected keyword_alias, expecting ')'
def self.find_by_alias(alias, options = {})
Change your column name. As you see, alias is Ruby keyword and it shouldn't be used as column name.

factorygirl order of parameters break create() method?

Why does:
fi = FactoryGirl.create(:finder_item, store_id: s.id, :category_foo, :random_question)
throw an error finder_item_spec.rb:20: syntax error, unexpected ',', expecting tASSOC (SyntaxError)
but simply re-ordering so the the traits are before the assignment works fine:
fi = FactoryGirl.create(:finder_item, :category_foo, :random_question, store_id: s.id)
One of your arguments is not just symbol type - it's :key => value, and for a FG order of arguments with different types is something that matters.

Resources